home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / 68hc11 / buf25_as.txt < prev    next >
Text File  |  1994-10-20  |  121KB  |  4,808 lines

  1. *                  BUFFALO
  2. * "Bit User's Fast Friendly Aid to Logical Operation"
  3. *
  4. * Rev 2.0 - 4/23/85 - added disassembler.
  5. *                   - variables now PTRn and TMPn.
  6. * Rev 2.1 - 4/29/85 - added byte erase to chgbyt routine.
  7. * Rev 2.2 - 5/16/85 - added hooks for evb board - acia
  8. *                     drivers, init and host routines.
  9. *           7/8/85  - fixed dump wraparound problem.
  10. *           7/10/85 - added evm board commands.
  11. *                   - added fill instruction.
  12. *           7/18/85 - added jump to EEPROM.
  13. * Rev 2.3 - 8/22/85 - call targco to disconnect sci from host
  14. *                     in reset routine for evb board.
  15. *           10/3/85 - modified load for download through terminal.
  16. * Rev 2.4 - 7/1/86  - Changed DFLOP address to fix conflicts with
  17. *                     EEPROM.  (was at A000)
  18. * Rev 2.5 - 9/8/86  - Modified to provide additional protection from
  19. *                     program run-away on power down.  Also fixed bugs
  20. *                     in MM and MOVE.  Changed to 1 stop bit from 2.
  21. *                    
  22. ****************************************************
  23. *    Although the information contained herein,    *
  24. *    as well as any information provided relative  *
  25. *    thereto, has been carefully reviewed and is   *
  26. *    believed accurate, Motorola assumes no        *
  27. *    liability arising out of its application or   *
  28. *    use, neither does it convey any license under *
  29. *    its patent rights nor the rights of others.   *
  30. ****************************************************
  31.  
  32. ***************
  33. *   EQUATES   *
  34. ***************
  35. RAMBS   EQU  $0000      start of ram
  36. REGBS   EQU  $1000      start of registers
  37. ROMBS   EQU  $E000      start of rom
  38. PORTE   EQU  REGBS+$0A  port e
  39. TCNT    EQU  REGBS+$0E  timer count
  40. TOC5    EQU  REGBS+$1E  oc5 reg
  41. TCTL1   EQU  REGBS+$20  timer control 1
  42. TMSK1   EQU  REGBS+$22  timer mask 1
  43. TFLG1   EQU  REGBS+$23  timer flag 1
  44. TMSK2   EQU  REGBS+$24  timer mask 2
  45. BAUD    EQU  REGBS+$2B  sci baud reg
  46. SCCR1   EQU  REGBS+$2C  sci control1 reg
  47. SCCR2   EQU  REGBS+$2D  sci control2 reg
  48. SCSR    EQU  REGBS+$2E  sci status reg
  49. SCDAT   EQU  REGBS+$2F  sci data reg
  50. OPTION  EQU  REGBS+$39  option reg
  51. COPRST  EQU  REGBS+$3A  cop reset reg
  52. PPROG   EQU  REGBS+$3B  ee prog reg
  53. HPRIO   EQU  REGBS+$3C  hprio reg
  54. CONFIG  EQU  REGBS+$3F  config register
  55. DFLOP   EQU  $4000      evb d flip flop
  56. DUART   EQU  $D000      duart address
  57. PORTA   EQU  DUART
  58. PORTB   EQU  DUART+8
  59. ACIA    EQU  $9800      acia address
  60. PROMPT  EQU  '>'
  61. BUFFLNG EQU  35
  62. CTLA    EQU  $01        exit host or assembler
  63. CTLB    EQU  $02        send break to host
  64. CTLW    EQU  $17        wait
  65. CTLX    EQU  $18        abort
  66. DEL     EQU  $7F        abort
  67. EOT     EQU  $04        end of text/table
  68. SWI     EQU  $3F
  69.  
  70. ***************
  71. *     RAM     *
  72. ***************
  73.         ORG  $36
  74. *** Buffalo ram space ***
  75.         RMB  20    user stack area
  76. USTACK  RMB  30    monitor stack area
  77. STACK   RMB  1
  78. INBUFF  RMB  BUFFLNG    input buffer
  79. ENDBUFF EQU  *
  80. COMBUFF RMB  8     command buffer
  81. SHFTREG RMB  2     input shift register
  82. BRKTABL RMB  8     breakpoint table
  83. REGS    RMB  9     user's pc,y,x,a,b,c
  84. SP      RMB  2     user's sp
  85. AUTOLF  RMB  1     auto lf flag for i/o
  86. IODEV   RMB  1     0=sci,  1=acia, 2=duartA, 3=duartB
  87. EXTDEV  RMB  1     0=none, 1=acia, 2=duart,
  88. HOSTDEV RMB  1     0=sci,  1=acia,           3=duartB
  89. COUNT   RMB  1     # characters read
  90. PTRMEM  RMB  2     current memory location
  91.  
  92. *** Buffalo variables - used by: ***
  93. PTR0    RMB  2     main,readbuff,incbuff,AS
  94. PTR1    RMB  2     main,BR,DU,MO,AS
  95. PTR2    RMB  2     DU,GO,MO,AS
  96. PTR3    RMB  2     HO,MO,AS
  97. PTR4    RMB  2     GO,AS
  98. PTR5    RMB  2     AS
  99. PTR6    RMB  2     GO,AS
  100. PTR7    RMB  2     GO,AS
  101. TMP1    RMB  1     main,hexbin,buffarg,termarg
  102. TMP2    RMB  1     GO,HO,AS
  103. TMP3    RMB  1     AS
  104. TMP4    RMB  1     GO,HO,ME,AS
  105.  
  106. *** Vector jump table ***
  107. JSCI    RMB   3
  108. JSPI    RMB   3
  109. JPAIE   RMB   3
  110. JPAO    RMB   3
  111. JTOF    RMB   3
  112. JTOC5   RMB   3
  113. JTOC4   RMB   3
  114. JTOC3   RMB   3
  115. JTOC2   RMB   3
  116. JTOC1   RMB   3
  117. JTIC3   RMB   3
  118. JTIC2   RMB   3
  119. JTIC1   RMB   3
  120. JRTI    RMB   3
  121. JIRQ    RMB   3
  122. JXIRQ   RMB   3
  123. JSWI    RMB   3
  124. JILLOP  RMB   3
  125. JCOP    RMB   3
  126. JCLM    RMB   3
  127.  
  128. *****************
  129. *
  130. * ROM starts here *
  131. *
  132. *****************
  133.  
  134.         ORG  ROMBS
  135.  
  136. *****************
  137. **  BUFFALO - This is where Buffalo starts
  138. ** out of reset.  All initialization is done
  139. ** here including determination of where the
  140. ** user terminal is (SCI,ACIA, or DUART).
  141. *****************
  142.  
  143. BUFFALO  LDX  #PORTE
  144.          BRCLR 0,X $01 BUFISIT if bit 0 of port e is 1
  145.          JMP  $B600       then jump to the start of EEPROM
  146. BUFISIT  LDAA #$93
  147.          STAA OPTION      adpu, dly, irqe, cop
  148.          LDAA #$00
  149.          STAA TMSK2       timer pre = %1 for trace
  150.          LDS  #STACK      monitor stack pointer
  151.          JSR  VECINIT
  152.          LDX  #USTACK
  153.          STX  SP          default user stack
  154.          LDAA #$D0
  155.          STAA REGS+8      default user ccr
  156.          LDD  #$3F0D      initial command is ?
  157.          STD  INBUFF
  158.          JSR  BPCLR       clear breakpoints
  159.          CLR  AUTOLF
  160.          INC  AUTOLF      auto cr/lf = on
  161.  
  162. * Determine type of external comm device - none, or acia *
  163.  
  164.          CLR  EXTDEV      default is none
  165.          LDAA HPRIO
  166.          ANDA #$20
  167.          BEQ  BUFF2       jump if single chip mode
  168.          LDAA #$03        see if external acia exists
  169.          STAA ACIA        master reset
  170.          LDAA ACIA
  171.          ANDA #$7F        mask irq bit from status register
  172.          BNE  BUFF1       jump if status reg not 0
  173.          LDAA #$12
  174.          STAA ACIA        turn on acia
  175.          LDAA ACIA
  176.          ANDA #$02
  177.          BEQ  BUFF1       jump if tdre not set
  178.          LDAA #$01
  179.          STAA EXTDEV      external device is acia
  180.          BRA  BUFF2
  181.  
  182. BUFF1    EQU  *           see if duart exists
  183.          LDAA  DUART+$0C  read IRQ vector register
  184.          CMPA  #$0F       should be out of reset
  185.          BNE   BUFF2
  186.          LDAA #$AA
  187.          STAA DUART+$0C   write irq vector register
  188.          LDAA DUART+$0C   read irq vector register
  189.          CMPA #$AA
  190.          BNE  BUFF2
  191.          LDAA #$02
  192.          STAA EXTDEV      external device is duart A
  193.  
  194. * Find terminal port - SCI or external. *
  195.  
  196. BUFF2    CLR  IODEV
  197.          JSR  TARGCO    disconnect sci for evb board
  198.          JSR  SIGNON    initialize sci
  199.          LDAA EXTDEV
  200.          BEQ  BUFF3     jump if no external device
  201.          STAA IODEV
  202.          JSR  SIGNON    initialize external device
  203. BUFF3    CLR  IODEV
  204.          JSR  INPUT     get input from sci port
  205.          CMPA #$0D
  206.          BEQ  BUFF4     jump if cr - sci is terminal port
  207.          LDAA EXTDEV
  208.          BEQ  BUFF3     jump if no external device
  209.          STAA IODEV
  210.          JSR  INPUT     get input from external device
  211.          CMPA #$0D
  212.          BEQ  BUFF4     jump if cr - terminal found ext
  213.          BRA  BUFF3
  214.  
  215. SIGNON   JSR  INIT        initialize device
  216.          LDX  #MSG1       buffalo message
  217.          JSR  OUTSTRG
  218.          RTS
  219.  
  220. * Determine where host port should be. *
  221.  
  222. BUFF4    CLR  HOSTDEV     default - host = sci port
  223.          LDAA IODEV
  224.          CMPA #$01
  225.          BEQ  BUFF5       default host if term = acia
  226.          LDAA #$03
  227.          STAA HOSTDEV     else host is duart port b
  228. BUFF5    EQU  *
  229.  
  230. *****************
  231. **  MAIN - This module reads the user's input into
  232. ** a buffer called INBUFF.  The first field (assumed
  233. ** to be the command field) is then parsed into a
  234. ** second buffer called COMBUFF.  The command table
  235. ** is then searched for the contents of COMBUFF and
  236. ** if found, the address of the corresponding task
  237. ** routine is fetched from the command table.  The
  238. ** task is then called as a subroutine so that
  239. ** control returns back to here upon completion of
  240. ** the task.  Buffalo expects the following format
  241. ** for commands:
  242. **     <cmd>[<wsp><arg><wsp><arg>...]<cr>
  243. ** [] implies contents optional.
  244. ** <wsp> means whitespace character (space,comma,tab).
  245. ** <cmd> = command string of 1-8 characters.
  246. ** <arg> = Argument particular to the command.
  247. ** <cr> = Carriage return signifying end of input string.
  248. *****************
  249. * Prompt user
  250. *do
  251. *   a=input();
  252. *   if(a==(cntlx or del)) continue;
  253. *   elseif(a==backspace)
  254. *      b--;
  255. *      if(b<0) b=0;
  256. *   else
  257. *      if(a==cr && buffer empty)
  258. *         repeat last command;
  259. *      else put a into buffer;
  260. *         check if buffer full;
  261. *while(a != (cr or /)
  262.  
  263. MAIN     LDS  #STACK    initialize sp every time
  264.          CLR  AUTOLF
  265.          INC  AUTOLF    auto cr/lf = on
  266.          JSR  OUTCRLF
  267.          LDAA #PROMPT   prompt user
  268.          JSR  OUTPUT
  269.          CLRB
  270. MAIN1    JSR  INCHAR    read terminal
  271.          LDX  #INBUFF
  272.          ABX            pointer into buffer
  273.          CMPA #CTLX
  274.          BEQ  MAIN      jump if cntl X
  275.          CMPA #DEL
  276.          BEQ  MAIN      jump if del
  277.          CMPA #$08
  278.          BNE  MAIN2     jump if not bckspc
  279.          DECB
  280.          BLT  MAIN      jump if buffer empty
  281.          BRA  MAIN1
  282. MAIN2    CMPA #$D
  283.          BNE  MAIN3     jump if not cr
  284.          TSTB
  285.          BEQ  COMM0     jump if buffer empty
  286.          STAA ,X        put a in buffer
  287.          BRA  COMM0
  288. MAIN3    STAA ,X        put a in buffer
  289.          INCB
  290.          CMPB #BUFFLNG
  291.          BLE  MAIN4     jump if not long
  292.          LDX  #MSG3     "long"
  293.          JSR  OUTSTRG
  294.          BRA  MAIN
  295. MAIN4    CMPA #'/'
  296.          BNE  MAIN1     jump if not "/"
  297. *        *******************
  298.  
  299. *****************
  300. *  Parse out and evaluate the command field.
  301. *****************
  302. *Initialize
  303.  
  304. COMM0    EQU  *
  305.          CLR  TMP1        Enable "/" command
  306.          CLR  SHFTREG
  307.          CLR  SHFTREG+1
  308.          CLRB
  309.          LDX  #INBUFF     ptrbuff[] = inbuff[]
  310.          STX  PTR0
  311.          JSR  WSKIP       find first char
  312.  
  313. *while((a=readbuff) != (cr or wspace))
  314. *     upcase(a);
  315. *     buffptr[b] = a
  316. *     b++
  317. *     if (b > 8) error(too long);
  318. *     if(a == "/")
  319. *          if(enabled) mslash();
  320. *          else error(command?);
  321. *     else hexbin(a);
  322.  
  323. COMM1    EQU  *
  324.          JSR  READBUFF  read from buffer
  325.          LDX  #COMBUFF
  326.          ABX
  327.          JSR  UPCASE    convert to upper case
  328.          STAA ,X        put in command buffer
  329.          CMPA #$0D
  330.          BEQ  SRCH      jump if cr
  331.          JSR  WCHEK
  332.          BEQ  SRCH      jump if wspac
  333.          JSR  INCBUFF   move buffer pointer
  334.          INCB
  335.          CMPB #$8
  336.          BLE  COMM2
  337.          LDX  #MSG3     "long"
  338.          JSR  OUTSTRG
  339.          JMP  MAIN
  340.  
  341. COMM2    EQU  *
  342.          CMPA #'/'
  343.          BNE  COMM4       jump if not "/"
  344.          TST  TMP1
  345.          BNE  COMM3       jump if not enabled
  346.          STAB COUNT
  347.          LDX  #MSLASH
  348.          JMP  EXEC        execute "/"
  349. COMM3    LDX  #MSG8       "command?"
  350.          JSR  OUTSTRG
  351.          JMP  MAIN
  352. COMM4    EQU  *
  353.          JSR  HEXBIN
  354.          BRA  COMM1
  355.  
  356. *****************
  357. *   Search tables for command.  At this point,
  358. * COMBUFF holds the command field to be executed,
  359. * and B = # of characters in the command field.
  360. * The command table holds the whole command name
  361. * but only the first n characters of the command
  362. * must match what is in COMBUFF where n is the
  363. * number of characters entered by the user.
  364. *****************
  365. *count = b;
  366. *ptr1 = comtabl;
  367. *while(ptr1[0] != end of table)
  368. *   ptr1 = next entry
  369. *   for(b=1; b=count; b++)
  370. *      if(ptr1[b] == combuff[b]) continue;
  371. *      else error(not found);
  372. *   execute task;
  373. *  return();
  374. *return(command not found);
  375.  
  376. SRCH    STAB COUNT     size of command entered
  377.         LDX  #COMTABL  pointer to table
  378.         STX  PTR1      pointer to next entry
  379. SRCH1   LDX  PTR1
  380.         LDY  #COMBUFF  pointer to command buffer
  381.         LDAB 0,X
  382.         CMPB #$FF
  383.         BNE  SRCH2
  384.         LDX  #MSG2     "command not found"
  385.         JSR  OUTSTRG
  386.         JMP  MAIN
  387. SRCH2   PSHX            compute next table entry
  388.         ADDB #$3
  389.         ABX
  390.         STX  PTR1
  391.         PULX
  392.         CLRB
  393. SRCHLP  INCB            match characters loop
  394.         LDAA 1,X        read table
  395.         CMPA 0,Y        compare to combuff
  396.         BNE  SRCH1      try next entry
  397.         INX             move pointers
  398.         INY
  399.         CMPB COUNT
  400.         BLT  SRCHLP     loop countu1 times
  401.         LDX  PTR1
  402.         DEX
  403.         DEX
  404.         LDX  0,X     jump address from table
  405. EXEC    JSR  0,X     call task as subroutine
  406.         JMP  MAIN
  407. *
  408. *****************
  409. *   UTILITY SUBROUTINES - These routines
  410. * are called by any of the task routines.
  411. *****************
  412. *****************
  413. *  UPCASE(a) - If the contents of A is alpha,
  414. * returns a converted to uppercase.
  415. *****************
  416. UPCASE   CMPA #'a'
  417.          BLT  UPCASE1      jump if < a
  418.          CMPA #'z'
  419.          BGT  UPCASE1      jump if > z
  420.          SUBA #$20         convert
  421. UPCASE1  RTS
  422.  
  423. *****************
  424. *  BPCLR() - Clear all entries in the
  425. * table of breakpoints.
  426. *****************
  427. BPCLR    LDX  #BRKTABL
  428.          LDAB #8
  429. BPCLR1   CLR  0,X
  430.          INX
  431.          DECB
  432.          BGT  BPCLR1      loop 8 times
  433.          RTS
  434.  
  435. *****************
  436. *  RPRNT1(x) - Prints name and contents of a single
  437. * user register. On entry X points to name of register
  438. * in reglist.  On exit, a=register name.
  439. *****************
  440. REGLIST  FCC  'PYXABCS'       names
  441.          FCB  0,2,4,6,7,8,9   offset
  442.          FCB  1,1,1,0,0,0,1   size
  443. RPRNT1   LDAA 0,X
  444.          PSHA
  445.          PSHX
  446.          JSR  OUTPUT      name
  447.          LDAA #'-'
  448.          JSR  OUTPUT      dash
  449.          LDAB 7,X         contents offset
  450.          LDAA 14,X        bytesize
  451.          LDX  #REGS       address
  452.          ABX
  453.          TSTA
  454.          BEQ  RPRN2       jump if 1 byte
  455.          JSR  OUT1BYT     2 bytes
  456. RPRN2    JSR  OUT1BSP
  457.          PULX
  458.          PULA
  459.          RTS
  460.  
  461. *****************
  462. *  RPRINT() - Print the name and contents
  463. * of all the user registers.
  464. *****************
  465. RPRINT   PSHX
  466.          LDX  #REGLIST
  467. RPRI1    JSR  RPRNT1      print name
  468.          INX
  469.          CMPA #'S'        s is last register
  470.          BNE  RPRI1       jump if not done
  471.          PULX
  472.          RTS
  473.  
  474. *****************
  475. *   HEXBIN(a) - Convert the ASCII character in a
  476. * to binary and shift into shftreg.  Returns value
  477. * in tmp1 incremented if a is not hex.
  478. *****************
  479. HEXBIN  PSHA
  480.         PSHB
  481.         PSHX
  482.         JSR  UPCASE     convert to upper case
  483.         CMPA #'0'
  484.         BLT  HEXNOT     jump if a < $30
  485.         CMPA #'9'
  486.         BLE  HEXNMB     jump if 0-9
  487.         CMPA #'A'
  488.         BLT  HEXNOT     jump if $39> a <$41
  489.         CMPA #'F'
  490.         BGT  HEXNOT     jump if a > $46
  491.         ADDA #$9        convert $A-$F
  492. HEXNMB  ANDA #$0F       convert to binary
  493.         LDX  #SHFTREG
  494.         LDAB #4
  495. HEXSHFT ASL  1,X        2 byte shift through
  496.         ROL  0,X               carry bit
  497.         DECB
  498.         BGT  HEXSHFT    shift 4 times
  499.         ORAA 1,X
  500.         STAA 1,X
  501.         BRA  HEXRTS
  502. HEXNOT  INC  TMP1       indicate not hex
  503. HEXRTS  PULX
  504.         PULB
  505.         PULA
  506.         RTS
  507.  
  508. *****************
  509. *  BUFFARG() - Build a hex argument from the
  510. * contents of the input buffer. Characters are
  511. * converted to binary and shifted into shftreg
  512. * until a non-hex character is found.  On exit
  513. * shftreg holds the last four digits read, count
  514. * holds the number of digits read, ptrbuff points
  515. * to the first non-hex character read, and A holds
  516. * that first non-hex character.
  517. *****************
  518. *Initialize
  519. *while((a=readbuff()) not hex)
  520. *     hexbin(a);
  521. *return();
  522.  
  523. BUFFARG  CLR  TMP1        not hex indicator
  524.          CLR  COUNT       # or digits
  525.          CLR  SHFTREG
  526.          CLR  SHFTREG+1
  527.          JSR  WSKIP
  528. BUFFLP   JSR  READBUFF    read char
  529.          JSR  HEXBIN
  530.          TST  TMP1
  531.          BNE  BUFFRTS     jump if not hex
  532.          INC  COUNT
  533.          JSR  INCBUFF     move buffer pointer
  534.          BRA  BUFFLP
  535. BUFFRTS  RTS
  536.  
  537. *****************
  538. *  TERMARG() - Build a hex argument from the
  539. * terminal.  Characters are converted to binary
  540. * and shifted into shftreg until a non-hex character
  541. * is found.  On exit shftreg holds the last four
  542. * digits read, count holds the number of digits
  543. * read, and A holds the first non-hex character.
  544. *****************
  545. *initialize
  546. *while((a=inchar()) == hex)
  547. *     if(a = cntlx or del)
  548. *          abort;
  549. *     else
  550. *          hexbin(a); countu1++;
  551. *return();
  552.  
  553. TERMARG  CLR  COUNT
  554.          CLR  SHFTREG
  555.          CLR  SHFTREG+1
  556. TERM0    JSR  INCHAR
  557.          CMPA #CTLX
  558.          BEQ  TERM1     jump if controlx
  559.          CMPA #DEL
  560.          BNE  TERM2     jump if not delete
  561. TERM1    JMP  MAIN      abort
  562. TERM2    CLR  TMP1      hex indicator
  563.          JSR  HEXBIN
  564.          TST  TMP1
  565.          BNE  TERM3     jump if not hex
  566.          INC  COUNT
  567.          BRA  TERM0
  568. TERM3    RTS
  569.  
  570. *****************
  571. *   CHGBYT() - If shftreg is not empty, put
  572. * contents of shftreg at address in X.  If X
  573. * is an address in EEPROM then program it.
  574. *****************
  575. *if(count != 0)
  576. *   (x) = a;
  577. *   if(((x) != a) && (x == eeprom location))
  578. *      if((x) != $FF) byte erase (x);
  579. *      if(a != $FF) program(x) = a);
  580. *   if((x) != a) error(ROM)
  581. *return;
  582.  
  583. CHGBYT   TST  COUNT
  584.          BEQ  CHGBYT4   jump if shftreg empty
  585.          LDAA SHFTREG+1
  586.          STAA 0,X       attempt to write
  587.          LDAA 0,X
  588.          CMPA SHFTREG+1
  589.          BEQ  CHGBYT3   jump if it worked
  590.          CPX  #CONFIG
  591.          BEQ  CHGBYT1   jump if config reg
  592.          CPX  #$B600
  593.          BLO  CHGBYT3   jump if not EE
  594.          CPX  #$B7FF
  595.          BHI  CHGBYT3   jump if not EE
  596. CHGBYT1  EQU  *
  597.          LDAA 0,X
  598.          CMPA #$FF
  599.          BEQ  CHGBYT2   jump if already erased
  600.          LDAA #$16      do byte erase
  601.          STAA PPROG
  602.          LDAA #$FF
  603.          STAA 0,X
  604.          LDAA #$17
  605.          BNE  ACL1
  606.          CLRA           fail safe
  607. ACL1     STAA PPROG
  608.          BSR  CHGWAIT
  609.          LDAA #$00
  610.          STAA PPROG     end of byte erase
  611. CHGBYT2  EQU  *
  612.          LDAA SHFTREG+1
  613.          CMPA #$FF
  614.          BEQ  CHGBYT3   jump if no need to program
  615.          LDAA #$02      do byte program
  616.          STAA PPROG
  617.          LDAA SHFTREG+1
  618.          STAA 0,X
  619.          LDAA #$03
  620.          BNE  ACL2
  621.          CLRA           fail safe
  622. ACL2     STAA PPROG
  623.          BSR  CHGWAIT
  624.          LDAA #$00
  625.          STAA PPROG     end of byte program
  626. CHGBYT3  EQU  *
  627.          LDAA ,X
  628.          CMPA SHFTREG+1
  629.          BEQ  CHGBYT4
  630.          PSHX
  631.          LDX  #MSG6     "rom"
  632.          JSR  OUTSTRG
  633.          JSR  OUTCRLF
  634.          PULX
  635. CHGBYT4  EQU  *
  636.          RTS
  637.  
  638. CHGWAIT  EQU  *         delay 10 ms at E = 2MHz
  639.          PSHX
  640.          LDX  #$0D06
  641. CHGWAIT1 DEX
  642.          BNE  CHGWAIT1
  643.          PULX
  644.          RTS
  645.  
  646. *****************
  647. *  READBUFF() -  Read the character in INBUFF
  648. * pointed at by ptrbuff into A.  Returns ptrbuff
  649. * unchanged.
  650. *****************
  651. READBUFF PSHX
  652.          LDX  PTR0
  653.          LDAA 0,X
  654.          PULX
  655.          RTS
  656.  
  657. *****************
  658. *  INCBUFF(), DECBUFF() - Increment or decrement
  659. * ptrbuff.
  660. *****************
  661. INCBUFF  PSHX
  662.          LDX  PTR0
  663.          INX
  664.          BRA  INCDEC
  665. DECBUFF  PSHX
  666.          LDX  PTR0
  667.          DEX
  668. INCDEC   STX  PTR0
  669.          PULX
  670.          RTS
  671.  
  672. *****************
  673. *  WSKIP() - Read from the INBUFF until a
  674. * non whitespace (space, comma, tab) character
  675. * is found.  Returns ptrbuff pointing to the
  676. * first non-whitespace character and a holds
  677. * that character.
  678. *****************
  679. WSKIP    JSR  READBUFF  read character
  680.          JSR  WCHEK
  681.          BNE  WSKIP1    jump if not wspc
  682.          JSR  INCBUFF   move pointer
  683.          BRA  WSKIP     loop
  684. WSKIP1   RTS
  685.  
  686. *****************
  687. *  WCHEK(a) - Returns z=1 if a holds a
  688. * whitespace character, else z=0.
  689. *****************
  690. WCHEK    CMPA #$2C      comma
  691.          BEQ  WCHEK1
  692.          CMPA #$20      space
  693.          BEQ  WCHEK1
  694.          CMPA #$09      tab
  695. WCHEK1   RTS
  696.  
  697. *****************
  698. *   DCHEK(a) - Returns Z=1 if a = whitespace
  699. * or carriage return.  Else returns z=0.
  700. *****************
  701. DCHEK   JSR  WCHEK
  702.         BEQ  DCHEK1     jump if whitespace
  703.         CMPA #$0D
  704. DCHEK1  RTS
  705.  
  706. *****************
  707. *  CHKABRT() - Checks for a control x or delete
  708. * from the terminal.  If found, the stack is
  709. * reset and the control is transferred to main.
  710. * Note that this is an abnormal termination.
  711. *   If the input from the terminal is a control W
  712. * then this routine keeps waiting until any other
  713. * character is read.
  714. *****************
  715. *a=input();
  716. *if(a=cntl w) wait until any other key;
  717. *if(a = cntl x or del) abort;
  718.  
  719. CHKABRT  JSR  INPUT
  720.          BEQ  CHK4      jump if no input
  721.          CMPA #CTLW
  722.          BNE  CHK2      jump in not cntlw
  723. CHKABRT1 JSR  INPUT
  724.          BEQ  CHKABRT1  jump if no input
  725. CHK2     CMPA #DEL
  726.          BEQ  CHK3      jump if delete
  727.          CMPA #CTLX
  728.          BEQ  CHK3      jump if control x
  729.          CMPA #CTLA
  730.          BNE  CHK4      jump not control a
  731. CHK3     JMP  MAIN      abort
  732. CHK4     RTS            return
  733.  
  734. ***********************
  735. *  HOSTCO - connect sci to host for evb board.
  736. *  TARGCO - connect sci to target for evb board.
  737. ***********************
  738. HOSTCO   PSHA
  739.          LDAA #$01
  740.          STAA DFLOP     send 1 to d-flop
  741.          PULA
  742.          RTS
  743.  
  744. TARGCO   PSHA
  745.          LDAA #$00
  746.          STAA DFLOP     send 0 to d-flop
  747.          PULA
  748.          RTS
  749.  
  750. *
  751. **********
  752. *
  753. *     VECINIT - This routine checks for
  754. *        vectors in the RAM table.  All
  755. *        uninitialized vectors are programmed
  756. *        to JMP STOPIT
  757. *
  758. **********
  759. *
  760. VECINIT     LDX  #JSCI    Point to First RAM Vector
  761.          LDY  #STOPIT    Pointer to STOPIT routine
  762.          LDD  #$7E03    A=JMP opcode; B=offset
  763. VECLOOP     CMPA 0,X
  764.          BEQ  VECNEXT    If vector already in
  765.          STAA 0,X       install JMP
  766.          STY  1,X       to STOPIT routine
  767. VECNEXT     ABX        Add 3 to point at next vector
  768.          CPX  #JCLM+3    Done?
  769.          BNE  VECLOOP    If not, continue loop
  770.          RTS
  771. *
  772. STOPIT   LDAA #$50      Stop-enable; IRQ, XIRQ-Off
  773.          TAP
  774.          STOP        You are lost!  Shut down
  775.          JMP  STOPIT    In case continue by XIRQ
  776.  
  777. **********
  778. *
  779. *   I/O MODULE
  780. *     Communications with the outside world.
  781. * 3 I/O routines (INIT, INPUT, and OUTPUT) call
  782. * drivers specified by IODEV (0=SCI, 1=ACIA,
  783. * 2=DUARTA, 3=DUARTB).
  784. *
  785. **********
  786. *   INIT() - Initialize device specified by iodev.
  787. *********
  788. *
  789. INIT     EQU  *
  790.          PSHA        save registers
  791.          PSHX
  792.          LDAA IODEV
  793.          CMPA #$00
  794.          BNE  INIT1     jump not sci
  795.          JSR  ONSCI     initialize sci
  796.          BRA  INIT4
  797. INIT1    CMPA #$01
  798.          BNE  INIT2     jump not acia
  799.          JSR  ONACIA    initialize acia
  800.          BRA  INIT4
  801. INIT2    LDX  #PORTA
  802.          CMPA #$02
  803.          BEQ  INIT3     jump duart a
  804.          LDX  #PORTB
  805. INIT3    JSR  ONUART    initialize duart
  806. INIT4    PULX         restore registers
  807.          PULA
  808.          RTS
  809.  
  810. **********
  811. *  INPUT() - Read device. Returns a=char or 0.
  812. *    This routine also disarms the cop.
  813. **********
  814. INPUT    EQU  *
  815.          PSHX
  816.          LDAA #$55    reset cop
  817.          STAA COPRST
  818.          LDAA #$AA
  819.          STAA COPRST
  820.          LDAA IODEV
  821.          BNE  INPUT1    jump not sci
  822.          JSR  INSCI     read sci
  823.          BRA  INPUT4
  824. INPUT1   CMPA #$01
  825.          BNE  INPUT2    jump not acia
  826.          JSR  INACIA    read acia
  827.          BRA  INPUT4
  828. INPUT2   LDX  #PORTA
  829.          CMPA #$02
  830.          BEQ  INPUT3    jump if duart a
  831.          LDX  #PORTB
  832. INPUT3   JSR  INUART    read uart
  833. INPUT4   PULX
  834.          RTS
  835.  
  836. **********
  837. *   OUTPUT() - Output character in A.
  838. **********
  839.  
  840. OUTPUT   EQU  *
  841.          PSHA         save registers
  842.          PSHB
  843.          PSHX
  844.          LDAB IODEV
  845.          BNE  OUTPUT1   jump not sci
  846.          JSR  OUTSCI    write sci
  847.          BRA  OUTPUT4
  848. OUTPUT1  CMPB #$01
  849.          BNE  OUTPUT4   jump not acia
  850.          JSR  OUTACIA   write acia
  851.          BRA  OUTPUT4
  852. OUTPUT2  LDX  #PORTA
  853.          CMPB #$02
  854.          BEQ  OUTPUT3   jump if duart a
  855.          LDX  #PORTB
  856. OUTPUT3  JSR  OUTUART   write uart
  857. OUTPUT4  PULX
  858.          PULB
  859.          PULA
  860.          RTS
  861.  
  862. **********
  863. *   ONUART(port) - Initialize a duart port.
  864. * Sets duart to internal clock, divide by 16,
  865. * 8 data + 1 stop bits.
  866. **********
  867.  
  868. ONUART   LDAA #$22
  869.          STAA 2,X         reset receiver
  870.          LDAA #$38
  871.          STAA 2,X         reset transmitter
  872.          LDAA #$40
  873.          STAA 2,X         reset error status
  874.          LDAA #$10
  875.          STAA 2,X         reset pointer
  876.          LDAA #$00
  877.          STAA DUART+4     clock source
  878.          LDAA #$00
  879.          STAA DUART+5     interrupt mask
  880.          LDAA #$13
  881.          STAA 0,X         8 data, no parity
  882.          LDAA #$07
  883.          STAA 0,X         1 stop bits
  884.          LDAA #$BB        baud rate (9600)
  885.          STAA 1,X         tx and rcv baud rate
  886.          LDAA #$05
  887.          STAA 2,X         enable tx and rcv
  888.          RTS
  889.  
  890. **********
  891. *   INUART(port) - Check duart for any input.
  892. **********
  893.  
  894. INUART   LDAA 1,X         read status
  895.          ANDA #$01        check rdrf
  896.          BEQ  INUART1     jump if no data
  897.          LDAA 3,X         read data
  898.          ANDA #$7F        to mask parity
  899. INUART1  RTS
  900.  
  901. **********
  902. *   OUTUART(port) - Output the character in a.
  903. *        if autolf=1, transmits cr or lf as crlf.
  904. **********
  905. OUTUART  TST  AUTOLF
  906.          BEQ  OUTUART2    jump if no autolf
  907.          BSR  OUTUART2
  908.          CMPA #$0D
  909.          BNE  OUTUART1
  910.          LDAA #$0A        if cr, output lf
  911.          BRA  OUTUART2
  912. OUTUART1 CMPA #$0A
  913.          BNE  OUTUART3
  914.          LDAA #$0D        if lf, output cr
  915. OUTUART2 LDAB 1,X         check status
  916.          ANDB #$4
  917.          BEQ  OUTUART2    loop until tdre=1
  918.          ANDA #$7F        mask parity
  919.          STAA 3,X         send character
  920. OUTUART3 RTS
  921.  
  922. **********
  923. *   ONSCI() - Initialize the SCI for 9600
  924. *                 baud at 8 MHz Extal.
  925. **********
  926. ONSCI    LDAA #$30
  927.          STAA BAUD        baud register
  928.          LDAA #$00
  929.          STAA SCCR1
  930.          LDAA #$0C
  931.          STAA SCCR2       enable
  932.          RTS
  933.  
  934. **********
  935. *   INSCI() - Read from SCI.  Return a=char or 0.
  936. **********
  937. INSCI    LDAA SCSR      read status reg
  938.          ANDA #$20
  939.          BEQ  INSCI1    jump if rdrf=0
  940.          LDAA SCDAT     read data register
  941.          ANDA #$7F      mask parity
  942. INSCI1   RTS
  943.  
  944. **********
  945. *  OUTSCI() - Output A to sci. IF autolf = 1,
  946. *               cr and lf sent as crlf.
  947. **********
  948. OUTSCI   TST  AUTOLF
  949.          BEQ  OUTSCI2     jump if autolf=0
  950.          BSR  OUTSCI2
  951.          CMPA #$0D
  952.          BNE  OUTSCI1
  953.          LDAA #$0A        if cr, send lf
  954.          BRA  OUTSCI2
  955. OUTSCI1  CMPA #$0A
  956.          BNE  OUTSCI3
  957.          LDAA #$0D        if lf, send cr
  958. OUTSCI2  LDAB SCSR        read status
  959.          BITB #$80
  960.          BEQ  OUTSCI2     loop until tdre=1
  961.          ANDA #$7F        mask parity
  962.          STAA SCDAT       send character
  963. OUTSCI3  RTS
  964.  
  965. **********
  966. *   ONACIA - Initialize the ACIA for
  967. * 8 data bits, 1 stop bit, divide by 64 clock.
  968. **********
  969. ONACIA   LDX  #ACIA
  970.          LDAA #$03
  971.          STAA 0,X       master reset
  972.          LDAA #$16
  973.          STAA 0,X       setup
  974.          RTS
  975.  
  976. **********
  977. *   INACIA - Read from the ACIA, Return a=char or 0.
  978. **********
  979. INACIA   LDX  #ACIA
  980.          LDAA 0,X       status
  981.          PSHA
  982.          ANDA #$70      check pe, ov, fe
  983.          PULA
  984.          BEQ  INACIA1   jump - no error
  985.          BSR  ONACIA    reinitialize and try again
  986.          BRA  INACIA
  987. INACIA1  LSRA           check rdrf
  988.          BCS  INACIA2   jump if data
  989.          CLRA           return(no data)
  990.          RTS
  991. INACIA2  LDAA 1,X       read data
  992.          ANDA #$7F      mask parity
  993.          RTS
  994.  
  995. **********
  996. *  OUTACIA - Output A to acia. IF autolf = 1,
  997. *               cr or lf sent as crlf.
  998. **********
  999. OUTACIA  BSR  OUTACIA3  output char
  1000.          TST  AUTOLF
  1001.          BEQ  OUTACIA2  jump no autolf
  1002.          CMPA #$0D
  1003.          BNE  OUTACIA1
  1004.          LDAA #$0A
  1005.          BSR  OUTACIA3  if cr, output lf
  1006.          BRA  OUTACIA2
  1007. OUTACIA1 CMPA #$0A
  1008.          BNE  OUTACIA2
  1009.          LDAA #$0D
  1010.          BSR  OUTACIA3  if lf, output cr
  1011. OUTACIA2 RTS
  1012.  
  1013. OUTACIA3 LDX  #ACIA
  1014.          LDAB 0,X
  1015.          BITB #$2
  1016.          BEQ  OUTACIA3  loop until tdre
  1017.          ANDA #$7F      mask parity
  1018.          STAA 1,X       output
  1019.          RTS
  1020. *
  1021. *     Space for modifying OUTACIA routine
  1022. *
  1023.      FDB  $FFFF,$FFFF,$FFFF,$FFFF 
  1024. *******************************
  1025. *** I/O UTILITY SUBROUTINES ***
  1026. ***These subroutines perform the neccesary
  1027. * data I/O operations.
  1028. * OUTLHLF-Convert left 4 bits of A from binary
  1029. *            to ASCII and output.
  1030. * OUTRHLF-Convert right 4 bits of A from binary
  1031. *            to ASCII and output.
  1032. * OUT1BYT-Convert byte addresed by X from binary
  1033. *           to ASCII and output.
  1034. * OUT1BSP-Convert byte addressed by X from binary
  1035. *           to ASCII and output followed by a space.
  1036. * OUT2BSP-Convert 2 bytes addressed by X from binary
  1037. *            to ASCII and  output followed by a space.
  1038. * OUTSPAC-Output a space.
  1039. *
  1040. * OUTCRLF-Output a line feed and carriage return.
  1041. *
  1042. * OUTSTRG-Output the string of ASCII bytes addressed
  1043. *            by X until $04.
  1044. * OUTA-Output the ASCII character in A.
  1045. *
  1046. * INCHAR-Input to A and echo one character.  Loops
  1047. *            until character read.
  1048. *        *******************
  1049.  
  1050. **********
  1051. *  OUTRHLF(), OUTLHLF(), OUTA()
  1052. *Convert A from binary to ASCII and output.
  1053. *Contents of A are destroyed..
  1054. **********
  1055. OUTLHLF  LSRA            shift data to right
  1056.          LSRA
  1057.          LSRA
  1058.          LSRA
  1059. OUTRHLF  ANDA #$0F       mask top half
  1060.          ADDA #$30       convert to ascii
  1061.          CMPA #$39
  1062.          BLE  OUTA       jump if 0-9
  1063.          ADDA #$07       convert to hex A-F
  1064. OUTA     JSR  OUTPUT     output character
  1065.          RTS
  1066.  
  1067. **********
  1068. *  OUT1BYT(x) - Convert the byte at X to two
  1069. * ASCII characters and output. Return X pointing
  1070. * to next byte.
  1071. **********
  1072. OUT1BYT  PSHA
  1073.          LDAA 0,X        get data in a
  1074.          PSHA            save copy
  1075.          BSR  OUTLHLF    output left half
  1076.          PULA            retrieve copy
  1077.          BSR  OUTRHLF    output right half
  1078.          PULA
  1079.          INX
  1080.          RTS
  1081.  
  1082. **********
  1083. *  OUT1BSP(x), OUT2BSP(x) - Output 1 or 2 bytes
  1084. * at x followed by a space.  Returns x pointing to
  1085. * next byte.
  1086. **********
  1087. OUT2BSP  JSR  OUT1BYT      do first byte
  1088. OUT1BSP  JSR  OUT1BYT      do next byte
  1089. OUTSPAC  LDAA #$20         output a space
  1090.          JSR  OUTPUT
  1091.          RTS
  1092.  
  1093. **********
  1094. *  OUTCRLF() - Output a Carriage return and
  1095. * a line feed.  Returns a = cr.
  1096. **********
  1097. OUTCRLF  LDAA #$0D      cr
  1098.          JSR  OUTPUT    output a
  1099.          LDAA #$00
  1100.          JSR  OUTPUT    output padding
  1101.          LDAA #$0D
  1102.          RTS
  1103.  
  1104. **********
  1105. *  OUTSTRG(x) - Output string of ASCII bytes
  1106. * starting at x until end of text ($04).  Can
  1107. * be paused by control w (any char restarts).
  1108. **********
  1109. OUTSTRG  JSR  OUTCRLF
  1110. OUTSTRG0 PSHA
  1111. OUTSTRG1 LDAA 0,X          read char into a
  1112.          CMPA #EOT
  1113.          BEQ  OUTSTRG3     jump if eot
  1114.          JSR  OUTPUT       output character
  1115.          INX
  1116.          JSR  INPUT
  1117.          BEQ  OUTSTRG1     jump if no input
  1118.          CMPA #CTLW
  1119.          BNE  OUTSTRG1     jump if not cntlw
  1120. OUTSTRG2 JSR  INPUT
  1121.          BEQ  OUTSTRG2     jump if any input
  1122.          BRA  OUTSTRG1
  1123. OUTSTRG3 PULA
  1124.          RTS
  1125.  
  1126. **********
  1127. *  INCHAR() - Reads input until character sent.
  1128. *    Echoes char and returns with a = char.
  1129. INCHAR   JSR  INPUT
  1130.          TSTA
  1131.          BEQ  INCHAR      jump if no input
  1132.          JSR  OUTPUT      echo
  1133.          RTS
  1134.  
  1135. *********************
  1136. *** COMMAND TABLE ***
  1137. COMTABL  EQU  *
  1138.          FCB  5
  1139.          FCC  'ASSEM'
  1140.          FDB  #ASSEM
  1141.          FCB  5
  1142.          FCC  'BREAK'
  1143.          FDB  #BREAK
  1144.          FCB  4
  1145.          FCC  'BULK'
  1146.          FDB  #BULK
  1147.          FCB  7
  1148.          FCC  'BULKALL'
  1149.          FDB  #BULKALL
  1150.          FCB  4
  1151.          FCC  'CALL'
  1152.          FDB  #CALL
  1153.          FCB  4
  1154.          FCC  'DUMP'
  1155.          FDB  #DUMP
  1156.          FCB  4
  1157.          FCC  'FILL'
  1158.          FDB  #FILL
  1159.          FCB  2
  1160.          FCC  'GO'
  1161.          FDB  #GO
  1162.          FCB  4
  1163.          FCC  'HELP'
  1164.          FDB  #HELP
  1165.          FCB  4
  1166.          FCC  'HOST'
  1167.          FDB  #HOST
  1168.          FCB  4
  1169.          FCC  'LOAD'
  1170.          FDB  #LOAD
  1171.          FCB  6          LENGTH OF COMMAND
  1172.          FCC  'MEMORY'   ASCII COMMAND
  1173.          FDB  #MEMORY    COMMAND ADDRESS
  1174.          FCB  4
  1175.          FCC  'MOVE'
  1176.          FDB  #MOVE
  1177.          FCB  7
  1178.          FCC  'PROCEED'
  1179.          FDB  #PROCEED
  1180.          FCB  8
  1181.          FCC  'REGISTER'
  1182.          FDB  #REGISTER
  1183.          FCB  5
  1184.          FCC  'TRACE'
  1185.          FDB  #TRACE
  1186.          FCB  6
  1187.          FCC  'VERIFY'
  1188.          FDB  #VERIFY
  1189.          FCB  1
  1190.          FCC  '?'       initial command
  1191.          FDB  #HELP
  1192.          FCB  5
  1193.          FCC  'XBOOT'
  1194.          FDB  #BOOT
  1195. *
  1196. *** Command names for evm compatability ***
  1197. *
  1198.          FCB  3
  1199.          FCC  'ASM'
  1200.          FDB  #ASSEM
  1201.          FCB  2
  1202.          FCC  'BF'
  1203.          FDB  #FILL
  1204.          FCB  4
  1205.          FCC  'COPY'
  1206.          FDB  #MOVE
  1207.          FCB  5
  1208.          FCC  'ERASE'
  1209.          FDB  #BULK
  1210.          FCB  2
  1211.          FCC  'MD'
  1212.          FDB  #DUMP
  1213.          FCB  2
  1214.          FCC  'MM'
  1215.          FDB  #MEMORY
  1216.          FCB  2
  1217.          FCC  'RD'
  1218.          FDB  #REGISTER
  1219.          FCB  2
  1220.          FCC  'RM'
  1221.          FDB  #REGISTER
  1222.          FCB  4
  1223.          FCC  'READ'
  1224.          FDB  #MOVE
  1225.          FCB  2
  1226.          FCC  'TM'
  1227.          FDB  #HOST
  1228.          FCB  4
  1229.          FCC  'TEST'
  1230.          FDB  #EVBTEST
  1231.          FCB  -1
  1232.  
  1233. *******************
  1234. *** TEXT TABLES ***
  1235.  
  1236. MSG1    FCC   'BUFFALO 2.5 (ext) - Bit User Fast Friendly Aid to Logical Operation'
  1237.         FCB   EOT
  1238. MSG2    FCC   'What?'
  1239.         FCB   EOT
  1240. MSG3    FCC   'Too Long'
  1241.         FCB   EOT
  1242. MSG4    FCC   'Full'
  1243.         FCB   EOT
  1244. MSG5    FCC   'Op- '
  1245.         FCB   EOT
  1246. MSG6    FCC   'rom-'
  1247.         FCB   EOT
  1248. MSG8    FCC   'Command?'
  1249.         FCB   EOT
  1250. MSG9    FCC   'Bad argument'
  1251.         FCB   EOT
  1252. MSG10   FCC   'No host port available'
  1253.         FCB   EOT
  1254. MSG11   FCC   'done'
  1255.         FCB   EOT
  1256. MSG12   FCC   'checksum error'
  1257.         FCB   EOT
  1258. MSG13   FCC   'error addr '
  1259.         FCB   EOT
  1260.  
  1261. **********
  1262. *   break [-][<addr>] . . .
  1263. * Modifies the breakpoint table.  More than
  1264. * one argument can be entered on the command
  1265. * line but the table will hold only 4 entries.
  1266. * 4 types of arguments are implied above:
  1267. * break           Prints table contents.
  1268. * break <addr>    Inserts <addr>.
  1269. * break -<addr>   Deletes <addr>.
  1270. * break -         Clears all entries.
  1271. **********
  1272. * while 1
  1273. *     a = wskip();
  1274. *     switch(a)
  1275. *          case(cr):
  1276. *               bprint(); return;
  1277.  
  1278. BREAK   JSR  WSKIP
  1279.         CMPA #$0D
  1280.         BNE  BRKDEL     jump if not cr
  1281.         JSR  BPRINT     print table
  1282.         RTS
  1283.  
  1284. *          case("-"):
  1285. *               incbuff(); readbuff();
  1286. *               if(dchek(a))          /* look for wspac or cr */
  1287. *                    bpclr();
  1288. *                    breaksw;
  1289. *               a = buffarg();
  1290. *               if( !dchek(a) ) return(bad argument);
  1291. *               b = bpsrch();
  1292. *               if(b >= 0)
  1293. *                    brktabl[b] = 0;
  1294. *               breaksw;
  1295.  
  1296. BRKDEL  CMPA #'-'
  1297.         BNE  BRKDEF     jump if not -
  1298.         JSR  INCBUFF
  1299.         JSR  READBUFF
  1300.         JSR  DCHEK
  1301.         BNE  BRKDEL1    jump if not delimeter
  1302.         JSR  BPCLR      clear table
  1303.         JMP  BREAK      do next argument
  1304. BRKDEL1 JSR  BUFFARG    get address to delete
  1305.         JSR  DCHEK
  1306.         BEQ  BRKDEL2    jump if delimeter
  1307.         LDX  #MSG9      "bad argument"
  1308.         JSR  OUTSTRG
  1309.         RTS
  1310. BRKDEL2 JSR  BPSRCH     look for addr in table
  1311.         TSTB
  1312.         BMI  BRKDEL3    jump if not found
  1313.         LDX  #BRKTABL
  1314.         ABX
  1315.         CLR  0,X        clear entry
  1316.         CLR  1,X
  1317. BRKDEL3 JMP  BREAK      do next argument
  1318.  
  1319. *          default:
  1320. *               a = buffarg();
  1321. *               if( !dchek(a) ) return(bad argument);
  1322. *               b = bpsrch();
  1323. *               if(b < 0)            /* not already in table */
  1324. *                    x = shftreg;
  1325. *                    shftreg = 0;
  1326. *                    a = x[0]; x[0] = $3F
  1327. *                    b = x[0]; x[0] = a;
  1328. *                    if(b != $3F) return(rom);
  1329. *                    b = bpsrch();   /* look for hole */
  1330. *                    if(b >= 0) return(table full);
  1331. *                    brktabl[b] = x;
  1332. *               breaksw;
  1333.  
  1334. BRKDEF  JSR  BUFFARG    get argument
  1335.         JSR  DCHEK
  1336.         BEQ  BRKDEF1    jump if delimiter
  1337.         LDX  #MSG9      "bad argument"
  1338.         JSR  OUTSTRG
  1339.         RTS
  1340. BRKDEF1 JSR  BPSRCH     look for entry in table
  1341.         TSTB
  1342.         BGE  BREAK      jump if already in table
  1343.         LDX  SHFTREG    x = new entry
  1344.         LDAA 0,X
  1345.         LDAB #SWI
  1346.         STAB 0,X
  1347.         LDAB 0,X
  1348.         STAA 0,X
  1349.         CMPB #SWI
  1350.         BEQ  BRKDEF2    jump if writes ok
  1351.         STX  PTR1       save address
  1352.         LDX  #MSG6      "ROM-"
  1353.         JSR  OUTSTRG
  1354.         LDX  #PTR1
  1355.         JSR  OUT2BSP     print address
  1356.         JSR  BPRINT
  1357.         RTS
  1358. BRKDEF2 CLR  SHFTREG
  1359.         CLR  SHFTREG+1
  1360.         PSHX
  1361.         JSR  BPSRCH     look for 0 entry
  1362.         PULX
  1363.         TSTB
  1364.         BPL  BRKDEF3    jump if table not full
  1365.         LDX  #MSG4      "full"
  1366.         JSR  OUTSTRG
  1367.         JSR  BPRINT
  1368.         RTS
  1369. BRKDEF3 LDY  #BRKTABL
  1370.         ABY
  1371.         STX  0,Y        put new entry in
  1372.         JMP  BREAK      do next argument
  1373.  
  1374. **********
  1375. *   bprint() - print the contents of the table.
  1376. **********
  1377. BPRINT   JSR  OUTCRLF
  1378.          LDX  #BRKTABL
  1379.          LDAB #4
  1380. BPRINT1  JSR  OUT2BSP
  1381.          DECB
  1382.          BGT  BPRINT1     loop 4 times
  1383.          RTS
  1384.  
  1385. **********
  1386. *   bpsrch() - search table for address in
  1387. * shftreg. Returns b = index to entry or
  1388. * b = -1 if not found.
  1389. **********
  1390. *for(b=0; b=6; b=+2)
  1391. *     x[] = brktabl + b;
  1392. *     if(x[0] = shftreg)
  1393. *          return(b);
  1394. *return(-1);
  1395.  
  1396. BPSRCH   CLRB
  1397. BPSRCH1  LDX  #BRKTABL
  1398.          ABX
  1399.          LDX  0,X       get table entry
  1400.          CPX  SHFTREG
  1401.          BNE  BPSRCH2   jump if no match
  1402.          RTS
  1403. BPSRCH2  INCB
  1404.          INCB
  1405.          CMPB #$6
  1406.          BLE  BPSRCH1  loop 4 times
  1407.          LDAB #$FF
  1408.          RTS
  1409.  
  1410.  
  1411. **********
  1412. *  bulk  - Bulk erase the eeprom except the
  1413. * config register.
  1414. **********
  1415. BULK    CLR  TMP2
  1416.         BRA  BULK1
  1417.  
  1418. **********
  1419. *  bulkall - Bulk erase the eeprom and the
  1420. * config register.
  1421. **********
  1422. BULKALL CLR  TMP2
  1423.         INC  TMP2
  1424.  
  1425. *Set up PPROG register for erase
  1426. BULK1    PSHA
  1427.          LDAA #$06
  1428.          STAA PPROG       set eelat, erase bits
  1429.  
  1430. *If (EE only) write to $b600
  1431. *Else write to config register
  1432.          LDAA #$FF
  1433.          TST  TMP2
  1434.          BNE  BULK2       jump if config
  1435.          STAA $B600       write to $b600
  1436.          BRA  BULK3
  1437. BULK2    STAA CONFIG
  1438. BULK3    EQU  *
  1439.  
  1440. *Start erasing
  1441.          LDAA #$07
  1442.          BNE  ACL3
  1443.          CLRA           fail safe
  1444. ACL3     STAA PPROG
  1445.  
  1446. *Delay for 10 ms at E = 2 MHz
  1447.          PSHX
  1448.          LDX  #$0D06     6~ * 3334 = 20,004 * 0.5 MHz
  1449. BULKDLY  DEX            2~
  1450.          BNE  BULKDLY   3~
  1451.          PULX
  1452.  
  1453. *Stop programming
  1454.          CLR  PPROG
  1455.          PULA
  1456.          RTS
  1457.  
  1458. **********
  1459. *  dump [<addr1> [<addr2>]]  - Dump memory
  1460. * in 16 byte lines from <addr1> to <addr2>.
  1461. *   Default starting address is "current
  1462. * location" and default number of lines is 8.
  1463. **********
  1464. *ptr1 = ptrmem;        /* default start address */
  1465. *ptr2 = ptr1 + $80;    /* default end address */
  1466. *a = wskip();
  1467. *if(a != cr)
  1468. *     a = buffarg();
  1469. *     if(countu1 = 0) return(bad argument);
  1470. *     if( !dchek(a) ) return(bad argument);
  1471. *     ptr1 = shftreg;
  1472. *     ptr2 = ptr1 + $80;  /* default end address */
  1473. *     a = wskip();
  1474. *     if(a != cr)
  1475. *          a = buffarg();
  1476. *          if(countu1 = 0) return(bad argument);
  1477. *          a = wskip();
  1478. *          if(a != cr) return(bad argument);
  1479. *          ptr2 = shftreg;
  1480.  
  1481. DUMP     LDX  PTRMEM    current location
  1482.          STX  PTR1      default start
  1483.          LDAB #$80
  1484.          ABX
  1485.          STX  PTR2      default end
  1486.          JSR  WSKIP
  1487.          CMPA #$D
  1488.          BEQ  DUMP1     jump - no arguments
  1489.          JSR  BUFFARG   read argument
  1490.          TST  COUNT
  1491.          BEQ  DUMPERR   jump if no argument
  1492.          JSR  DCHEK
  1493.          BNE  DUMPERR   jump if delimiter
  1494.          LDX  SHFTREG
  1495.          STX  PTR1
  1496.          LDAB #$80
  1497.          ABX
  1498.          STX  PTR2      default end address
  1499.          JSR  WSKIP
  1500.          CMPA #$D
  1501.          BEQ  DUMP1     jump - 1 argument
  1502.          JSR  BUFFARG   read argument
  1503.          TST  COUNT
  1504.          BEQ  DUMPERR   jump if no argument
  1505.          JSR  WSKIP
  1506.          CMPA #$0D
  1507.          BNE  DUMPERR   jump if not cr
  1508.          LDX  SHFTREG
  1509.          STX  PTR2
  1510.          BRA  DUMP1     jump - 2 arguments
  1511. DUMPERR  LDX  #MSG9     "bad argument"
  1512.          JSR  OUTSTRG
  1513.          RTS
  1514.  
  1515. *ptrmem = ptr1;
  1516. *ptr1 = ptr1 & $fff0;
  1517.  
  1518. DUMP1    LDD  PTR1
  1519.          STD  PTRMEM    new current location
  1520.          ANDB #$F0
  1521.          STD  PTR1      start dump at 16 byte boundary
  1522.  
  1523. *** dump loop starts here ***
  1524. *do:
  1525. *     output address of first byte;
  1526.  
  1527. DUMPLP   JSR  OUTCRLF
  1528.          LDX  #PTR1
  1529.          JSR  OUT2BSP   first address
  1530.  
  1531. *     x = ptr1;
  1532. *     for(b=0; b=16; b++)
  1533. *          output contents;
  1534.  
  1535.          LDX  PTR1      base address
  1536.          CLRB           loop counter
  1537. DUMPDAT  JSR  OUT1BSP   hex value loop
  1538.          INCB
  1539.          CMPB #$10
  1540.          BLT  DUMPDAT    loop 16 times
  1541.  
  1542. *     x = ptr1;
  1543. *     for(b=0; b=16; b++)
  1544. *          a = x[b];
  1545. *          if($7A < a < $20)  a = $20;
  1546. *          output ascii contents;
  1547.  
  1548.          CLRB           loop counter
  1549. DUMPASC  LDX  PTR1      base address
  1550.          ABX
  1551.          LDAA ,X        ascii value loop
  1552.          CMPA #$20
  1553.          BLO  DUMP3     jump if non printable
  1554.          CMPA #$7A
  1555.          BLS  DUMP4     jump if printable
  1556. DUMP3    LDAA #$20      space for non printables
  1557. DUMP4    JSR  OUTPUT    output ascii value
  1558.          INCB
  1559.          CMPB #$10
  1560.          BLT  DUMPASC   loop 16 times
  1561.  
  1562. *     chkabrt();
  1563. *     ptr1 = ptr1 + $10;
  1564. *while(ptr1 <= ptr2);
  1565. *return;
  1566.  
  1567.          JSR  CHKABRT   check abort or wait
  1568.          LDD  PTR1
  1569.          ADDD #$10      point to next 16 byte bound
  1570.          STD  PTR1      update ptr1
  1571.          CPD  PTR2
  1572.          BHI  DUMP5     quit if ptr1 > ptr2
  1573.          CPD  #$00      check wraparound at $ffff
  1574.          BNE  DUMPLP    jump - no wraparound
  1575.          LDD  PTR2
  1576.          CPD  #$FFF0
  1577.          BLO  DUMPLP    upper bound not at top
  1578. DUMP5    RTS            quit
  1579.  
  1580. **********
  1581. *  fill <addr1> <addr2> [<data>]  - Block fill
  1582. *memory from addr1 to addr2 with data.  Data
  1583. *defaults to $FF.
  1584. **********
  1585. *get addr1 and addr2
  1586.  
  1587. FILL    EQU  *
  1588.         JSR  WSKIP
  1589.         JSR  BUFFARG
  1590.         TST  COUNT
  1591.         BEQ  FILLERR    jump if no argument
  1592.         JSR  WCHEK
  1593.         BNE  FILLERR    jump if bad argument
  1594.         LDX  SHFTREG
  1595.         STX  PTR1       address1
  1596.         JSR  WSKIP
  1597.         JSR  BUFFARG
  1598.         TST  COUNT
  1599.         BEQ  FILLERR    jump if no argument
  1600.         JSR  DCHEK
  1601.         BNE  FILLERR    jump if bad argument
  1602.         LDX  SHFTREG
  1603.         STX  PTR2       address2
  1604.  
  1605. *Get data if it exists
  1606.         LDAA #$FF
  1607.         STAA TMP2       default data
  1608.         JSR  WSKIP
  1609.         CMPA #$0D
  1610.         BEQ  FILL1      jump if default data
  1611.         JSR  BUFFARG
  1612.         TST  COUNT
  1613.         BEQ  FILLERR    jump if no argument
  1614.         JSR  WSKIP
  1615.         CMPA #$0D
  1616.         BNE  FILLERR    jump if bad argument
  1617.         LDAA SHFTREG+1
  1618.         STAA TMP2
  1619.  
  1620. *while(ptr1 <= ptr2)
  1621. *   *ptr1 = data
  1622. *   if(*ptr1 != data) abort
  1623.  
  1624. FILL1   EQU  *
  1625.         JSR  CHKABRT    check for abort
  1626.         LDX  PTR1       starting address
  1627.         LDAA TMP2       data
  1628.         STAA 0,X
  1629.         CMPA 0,X
  1630.         BNE  FILLBAD    jump if no write
  1631.         CPX  PTR2
  1632.         BEQ  FILL2      quit yet?
  1633.         INX
  1634.         STX  PTR1
  1635.         BRA  FILL1      loop
  1636. FILL2   RTS
  1637.  
  1638. FILLERR  LDX  #MSG9     "bad argument"
  1639.          JSR  OUTSTRG
  1640.          RTS
  1641.  
  1642. FILLBAD  LDX  #MSG6     "rom -"
  1643.          JSR  OUTSTRG
  1644.          LDX  #PTR1
  1645.          JSR  OUT2BSP
  1646.          RTS
  1647.  
  1648. **********
  1649. *   call [<addr>] - Execute a jsr to addr or
  1650. *user's pc value.  Return to monitor by rts
  1651. *or breakpoint.
  1652. **********
  1653. *a = wskip();
  1654. *if(a != cr)
  1655. *     a = buffarg();
  1656. *     a = wskip();
  1657. *     if(a != cr) return(bad argument)
  1658. *     pc = shftreg;
  1659.  
  1660. CALL     JSR  WSKIP
  1661.          CMPA #$D
  1662.          BEQ  CALL3       jump if no arg
  1663.          JSR  BUFFARG
  1664.          JSR  WSKIP
  1665.          CMPA #$D
  1666.          BEQ  CALL2       jump if cr
  1667.          LDX  #MSG9       "bad argument"
  1668.          JSR  OUTSTRG
  1669.          RTS
  1670. CALL2    LDX  SHFTREG
  1671.          STX  REGS        pc = <addr>
  1672.  
  1673. *user_stack[0] = return_to_monitor;
  1674. *setbps();
  1675. *restack();     /* restack and go*/
  1676.  
  1677. CALL3    LDX  SP
  1678.          DEX              user stack pointer
  1679.          LDD  #RETURN     return address
  1680.          STD  0,X
  1681.          DEX
  1682.          STX  SP          new user stack pointer
  1683.          JSR  SETBPS
  1684.          CLR  TMP2        flag for breakpoints
  1685.          JMP  RESTACK     executes an rti
  1686.  
  1687. **********
  1688. *   return() - Return here from rts after
  1689. *call command.
  1690. **********
  1691. RETURN   PSHA             save a register
  1692.          TPA
  1693.          STAA REGS+8      cc register
  1694.          PULA
  1695.          STD  REGS+6      a and b registers
  1696.          STX  REGS+4      x register
  1697.          STY  REGS+2      y register
  1698.          STS  SP          user stack pointer
  1699.          LDS  #STACK      monitor stack pointer
  1700.          JSR  REMBPS      remove breakpoints
  1701.          JSR  OUTCRLF
  1702.          JSR  RPRINT      print user registers
  1703.          JMP  MAIN
  1704.  
  1705. **********
  1706. *   go [<addr>] - Execute starting at <addr> or
  1707. *user's pc value.  Executes an rti to user code.
  1708. *Returns to monitor via an swi through swiin.
  1709. **********
  1710. *a = wskip();
  1711. *if(a != cr)
  1712. *     a = buffarg();
  1713. *     a = wskip();
  1714. *     if(a != cr) return(bad argument)
  1715. *     pc = shftreg;
  1716. *setbps();
  1717. *restack();     /* restack and go*/
  1718.  
  1719. GO       JSR  WSKIP
  1720.          CMPA #$0D
  1721.          BEQ  GO2         jump if no arg
  1722.          JSR  BUFFARG
  1723.          JSR  WSKIP
  1724.          CMPA #$0D
  1725.          BEQ  GO1         jump if cr
  1726.          LDX  #MSG9       "bad argument"
  1727.          JSR  OUTSTRG
  1728.          RTS
  1729. GO1      LDX  SHFTREG
  1730.          STX  REGS        pc = <addr>
  1731. GO2      CLR  TMP2        flag for breakpoints
  1732.          INC  TMP2        (1=go, 0=call)
  1733.          JSR  SETBPS
  1734.          JMP  RESTACK     execute an rti
  1735.  
  1736. **********
  1737. *   swiin() - return from SWI.  Set up
  1738. *stack pointers, save user registers, and
  1739. *return to main.
  1740. **********
  1741. SWIIN    TSX            swi entry point
  1742.          LDS  #STACK
  1743.          JSR  SAVSTACK save user regs
  1744.          LDX  REGS
  1745.          DEX
  1746.          STX  REGS     save user pc
  1747.          LDX  PTR4     restore user swi vector
  1748.          STX  JSWI+1
  1749.  
  1750. *if(flagt1 = 0) remove return addr from stack;
  1751.  
  1752.          TST  TMP2     0=call, 1=go
  1753.          BNE  GO3      jump if go command
  1754.          LDX  SP       remove return address
  1755.          INX
  1756.          INX
  1757.          STX  SP
  1758. GO3      JSR  OUTCRLF  print register values
  1759.          JSR  RPRINT
  1760.          JSR  REMBPS
  1761.          JMP  MAIN     return to monitor
  1762. *                      (sp destroyed above)
  1763.  
  1764. **********
  1765. *   proceed - Same as go except it ignores
  1766. *a breakpoint at the first opcode.  Calls
  1767. *trace once and the go.
  1768. **********
  1769. PROCEED  CLR  TMP2       flag for breakpoints
  1770.          INC  TMP2       0=trace, 1=proceed
  1771.          JMP  TRACE3
  1772.  
  1773. **********
  1774. *   trace <n> - Trace n instructions starting
  1775. *at user's pc value. n is a hex number less than
  1776. *$FF (defaults to 1).
  1777. **********
  1778. *countt1 = 1
  1779. *a = wskip();
  1780. *if(a != cr)
  1781. *     a = buffarg(); a = wskip();
  1782. *     if(a != cr) return(bad argument);
  1783. *     countt1 = n
  1784.  
  1785. TRACE    CLR  TMP4
  1786.          INC  TMP4        default countt1 = 1
  1787.          CLR  TMP2        0 = trace
  1788.          JSR  WSKIP
  1789.          CMPA #$0D
  1790.          BEQ  TRACE2      jump if cr
  1791.          JSR  BUFFARG
  1792.          JSR  WSKIP
  1793.          CMPA #$0D
  1794.          BEQ  TRACE1      jump if cr
  1795.          LDX  #MSG9       "bad argument"
  1796.          JSR  OUTSTRG
  1797.          RTS
  1798. TRACE1   LDAA SHFTREG+1   n
  1799.          STAA TMP4
  1800.  
  1801. *Print opcode
  1802. TRACE2   JSR  OUTCRLF
  1803.          LDX  #MSG5      "op-"
  1804.          JSR  OUTSTRG
  1805.          LDX  REGS
  1806.          JSR  OUT1BSP    opcode
  1807.  
  1808. *Save user OC5 regs, setup monitor OC5 regs
  1809. TRACE3   LDAA TCTL1
  1810.          STAA PTR2       save user mode/level
  1811.          ANDA #$FC
  1812.          STAA TCTL1      disable oc5 output
  1813.          LDAA TMSK1
  1814.          STAA PTR2+1     save user int masks
  1815.          CLR  TMSK2      disable tof and pac ints
  1816.  
  1817. *Put monitor TOC5 vector into jump table
  1818.          LDX  JTOC5+1
  1819.          STX  PTR4        save user's vector
  1820.          LDAA #$7E        jmp opcode
  1821.          STAA JTOC5
  1822.          LDX  #TRACEIN
  1823.          STX  JTOC5+1     monitor toc5 vector
  1824.  
  1825. *Unmask i bit in user ccr
  1826.          LDAA REGS+8      user ccr
  1827.          ANDA #$EF        clear i bit
  1828.          STAA REGS+8
  1829.  
  1830. *Arm OC5 interrupt
  1831.          LDAB #87        cycles to end of rti
  1832.          LDX  TCNT       timer count value
  1833.          ABX                                     3~  *
  1834.          STX  TOC5       oc5 match register      5~  *
  1835.          LDAA #$08                               2~  *
  1836.          STAA TFLG1      clear oc5 int flag      4~  *
  1837.          STAA TMSK1      enable oc5 interrupt    4~  * 86~
  1838.          CLI                                     2~  *
  1839.          JMP  RESTACK    execute an rti         66~  *
  1840.  
  1841. **********
  1842. *   tracein - return from toc5 interrupt.
  1843. **********
  1844. *Disable toc5 interrupt
  1845. *replace user's toc5 vector
  1846. TRACEIN  SEI
  1847.          CLR  TMSK1      disable timer ints
  1848.          TSX
  1849.          LDS  #STACK
  1850.          JSR  SAVSTACK   save user regs
  1851.          LDX  PTR4
  1852.          STX  JTOC5+1
  1853.          JSR  CHKABRT    check for abort
  1854.  
  1855. *if(flagt1 = 1) jump to GO command ( proceed )
  1856.          TST  TMP2
  1857.          BEQ  TRACE9      jump if trace command
  1858.          JMP  GO2
  1859.  
  1860. *rprint();
  1861. *while(countt1 >= 0) continue trace;
  1862.  
  1863. TRACE9   JSR  OUTCRLF     print registers for
  1864.          JSR  RPRINT              trace only.
  1865.          DEC  TMP4
  1866.          BHI  TRACE2      jump if countt1 >= 0
  1867.          JMP  MAIN        return to monitor
  1868. *                         (sp destroyed above)
  1869.  
  1870. **********
  1871. *  setbps - Replace user code with swi's at
  1872. *breakpoint addresses.
  1873. **********
  1874. *for(b=0; b=6; b =+ 2)
  1875. *     x = brktabl[b];
  1876. *     if(x != 0)
  1877. *          optabl[b] = x[0];
  1878. *          x[0] = $3F;
  1879.  
  1880. SETBPS   CLRB
  1881. SETBPS1  LDX  #BRKTABL
  1882.          LDY  #PTR6
  1883.          ABX
  1884.          ABY
  1885.          LDX  0,X         breakpoint table entry
  1886.          BEQ  SETBPS2     jump if 0
  1887.          LDAA 0,X         save user opcode
  1888.          STAA 0,Y
  1889.          LDAA #SWI        insert swi into code
  1890.          STAA 0,X
  1891. SETBPS2  ADDB #$2
  1892.          CMPB #$6
  1893.          BLE  SETBPS1     loop 4 times
  1894.  
  1895. *Put monitor SWI vector into jump table
  1896.          LDX  JSWI+1
  1897.          STX  PTR4        save user swi vector
  1898.          LDAA #$7E        jmp opcode
  1899.          STAA JSWI
  1900.          LDX  #SWIIN
  1901.          STX  JSWI+1      monitor swi vector
  1902.          RTS
  1903.  
  1904. **********
  1905. *   rembps - Remove breakpoints from user code.
  1906. **********
  1907. *for(b=0; b=6; b =+ 2)
  1908. *     x = brktabl[b];
  1909. *     if(x != 0)
  1910. *          x[0] = optabl[b];
  1911.  
  1912. REMBPS   CLRB
  1913. REMBPS1  LDX  #BRKTABL
  1914.          LDY  #PTR6
  1915.          ABX
  1916.          ABY
  1917.          LDX  0,X         breakpoint table entry
  1918.          BEQ  REMBPS2     jump if 0
  1919.          LDAA 0,Y         restore user's opcode
  1920.          STAA 0,X
  1921. REMBPS2  ADDB #$2
  1922.          CMPB #$6
  1923.          BLE  REMBPS1     loop 4 times
  1924.  
  1925. *Replace user's SWI vector
  1926.          LDX  PTR4
  1927.          STX  JSWI+1
  1928.          RTS
  1929.  
  1930. **********
  1931. *  restack() - Restore user stack and
  1932. *execute an RTI. Extended addressing forced
  1933. *to ensure count value for trace.
  1934. **********
  1935. RESTACK  LDS  >SP        stack pointer
  1936.          LDX  >REGS
  1937.          PSHX            pc
  1938.          LDX  >REGS+2
  1939.          PSHX            y
  1940.          LDX  >REGS+4
  1941.          PSHX            x
  1942.          LDD  >REGS+6
  1943.          PSHA            a
  1944.          PSHB            b
  1945.          LDAA >REGS+8
  1946.          PSHA            ccr
  1947. RESTACK1 RTI
  1948.  
  1949. **********
  1950. *  savstack() -  Save user's registers.
  1951. **********
  1952. SAVSTACK LDAA 0,X
  1953.          STAA REGS+8      ccr
  1954.          LDD  1,X
  1955.          STAA REGS+7      b
  1956.          STAB REGS+6      a
  1957.          LDD  3,X
  1958.          STD  REGS+4      x
  1959.          LDD  5,X
  1960.          STD  REGS+2      y
  1961.          LDD  7,X
  1962.          STD  REGS        pc
  1963.          LDAB #8
  1964.          ABX
  1965.          STX  SP          stack pointer
  1966.          RTS
  1967.  
  1968. **********
  1969. *   help  -  List buffalo commands to terminal.
  1970. **********
  1971. HELP     EQU  *
  1972.          LDX  #HELPMSG1
  1973.          JSR  OUTSTRG    print help screen
  1974.          RTS
  1975.  
  1976. HELPMSG1 EQU  *
  1977.          FCC  'ASM [<addr>]  Line assembler/disassembler.'
  1978.          FCB  #$0D
  1979.          FCC  '    /        Do same address.           ^        Do previous address.'
  1980.          FCB  #$0D
  1981.          FCC  '    CTRL-J   Do next address.           RETURN   Do next opcode.'
  1982.          FCB  #$0D
  1983.          FCC  '    CTRL-A   Quit.'
  1984.          FCB  #$0D
  1985.          FCC  'BF <addr1> <addr2> [<data>]  Block fill.'
  1986.          FCB  #$0D
  1987.          FCC  'BR [-][<addr>]  Set up breakpoint table.'
  1988.          FCB  #$0D
  1989.          FCC  'BULK  Erase the EEPROM.                   BULKALL  Erase EEPROM and CONFIG.'
  1990.          FCB  #$0D
  1991.          FCC  'CALL [<addr>]  Call user subroutine.      G [<addr>]  Execute user code.'
  1992.          FCB  #$0D
  1993.          FCC  'LOAD, VERIFY [T] <host download command>  Load or verify S-records.'
  1994.          FCB  #$0D
  1995.          FCC  'MD [<addr1> [<addr2>]]  Memory dump.'
  1996.          FCB  #$0D
  1997.          FCC  'MM [<addr>]  Memory modify.'
  1998.          FCB  #$0D
  1999.          FCC  '    /        Open same address.         CTRL-H or ^   Open previous address.'
  2000.          FCB  #$0D
  2001.          FCC  '    CTRL-J   Open next address.         SPACE         Open next address.'
  2002.          FCB  #$0D
  2003.          FCC  '    RETURN   Quit.                      <addr>O       Compute offset to <addr>.'
  2004.          FCB  #$0D
  2005.          FCC  'MOVE <s1> <s2> [<d>]  Block move.'
  2006.          FCB  #$0D
  2007.          FCC  'P  Proceed/continue execution.'
  2008.          FCB  #$0D
  2009.          FCC  'RM [P, Y, X, A, B, C, or S]  Register modify.'
  2010.          FCB  #$0D
  2011.          FCC  'T [<n>]  Trace n instructions.'
  2012.          FCB  #$0D
  2013.          FCC  'TM  Transparent mode (CTRL-A = exit, CTRL-B = send break).'
  2014.          FCB  #$0D
  2015.          FCC  'CTRL-H  Backspace.                      CTRL-W  Wait for any key.'
  2016.          FCB  #$0D
  2017.          FCC  'CTRL-X or DELETE  Abort/cancel command.'
  2018.          FCB  #$0D
  2019.          FCC  'RETURN  Repeat last command.'
  2020.          FCB  4
  2021.  
  2022. **********
  2023. *   HOST() - Establishes transparent link between
  2024. *       terminal and host.  Port used for host is
  2025. *       determined in the reset initialization routine
  2026. *       and stored in HOSTDEV.
  2027. *          To exit type control A.
  2028. *          To send break to host type control B.
  2029. *if(no external device) return;
  2030. *initialize host port;
  2031. *While( !(control A))
  2032. *     input(terminal); output(host);
  2033. *     input(host); output(terminal);
  2034.  
  2035. HOST      LDAA EXTDEV
  2036.           BNE  HOST0    jump if host port avail.
  2037.           LDX  #MSG10   "no host port avail"
  2038.           JSR  OUTSTRG
  2039.           RTS
  2040. HOST0     CLR  AUTOLF    turn off autolf
  2041.           JSR  HOSTCO    connect sci (evb board)
  2042.           JSR  HOSTINIT  initialize host port
  2043. HOST1     JSR  INPUT     read terminal
  2044.           TSTA
  2045.           BEQ  HOST3     jump if no char
  2046.           CMPA #CTLA
  2047.           BEQ  HOSTEND   jump if control a
  2048.           CMPA #CTLB
  2049.           BNE  HOST2     jump if not control b
  2050.           JSR  TXBREAK   send break to host
  2051.           BRA  HOST3
  2052. HOST2     JSR  HOSTOUT   echo to host
  2053. HOST3     JSR  HOSTIN    read host
  2054.           TSTA
  2055.           BEQ  HOST1     jump if no char
  2056.           JSR  OUTPUT    echo to terminal
  2057.           BRA  HOST1
  2058. HOSTEND   INC  AUTOLF    turn on autolf
  2059.           JSR  TARGCO    disconnect sci (evb board)
  2060.           RTS            return
  2061.  
  2062. **********
  2063. * txbreak() - transmit break to host port.
  2064. * The duration of the transmitted break is
  2065. * approximately 200,000 E-clock cycles, or
  2066. * 100ms at 2.0 MHz.
  2067. ***********
  2068. TXBREAK   EQU  *
  2069.           LDAA HOSTDEV
  2070.           CMPA #$03
  2071.           BEQ  TXBDU    jump if duartb is host
  2072.  
  2073. TXBSCI    LDX  #SCCR2   sci is host
  2074.           BSET 0,X $01  set send break bit
  2075.           BSR  TXBWAIT
  2076.           BCLR 0,X $01  clear send break bit
  2077.           BRA TXB1
  2078.  
  2079. TXBDU     LDX  #PORTB   duart host port
  2080.           LDAA #$60     start break cmd
  2081.           STAA 2,X      port b command register
  2082.           BSR  TXBWAIT
  2083.           LDAA #$70     stop break cmd
  2084.           STAA 2,X      port b command register
  2085.  
  2086. TXB1      LDAA #$0D
  2087.           JSR  HOSTOUT  send carriage return
  2088.           LDAA #$0A
  2089.           JSR  HOSTOUT  send linefeed
  2090.           RTS
  2091.  
  2092. TXBWAIT   LDY  #$6F9B   loop count = 28571
  2093. TXBWAIT1  DEY           7 cycle loop
  2094.           BNE  TXBWAIT1
  2095.           RTS
  2096.  
  2097.  
  2098. **********
  2099. *   hostinit(), hostin(), hostout() - host i/o
  2100. *routines.  Restores original terminal device.
  2101. **********
  2102. HOSTINIT  LDAB IODEV    save terminal
  2103.           PSHB
  2104.           LDAB HOSTDEV
  2105.           STAB IODEV    point to host
  2106.           JSR  INIT     initialize host
  2107.           BRA  TERMRES  restore terminal
  2108. HOSTIN    LDAB IODEV    save terminal
  2109.           PSHB
  2110.           LDAB HOSTDEV
  2111.           STAB IODEV    point to host
  2112.           JSR  INPUT    read host
  2113.           BRA  TERMRES  restore terminal
  2114. HOSTOUT   LDAB IODEV    save terminal
  2115.           PSHB
  2116.           LDAB HOSTDEV
  2117.           STAB IODEV    point to host
  2118.           JSR  OUTPUT   write to host
  2119. TERMRES   PULB          restore terminal device
  2120.           STAB IODEV
  2121.           RTS
  2122.  
  2123.  
  2124. **********
  2125. *   load(ptrbuff[]) - Load s1/s9 records from
  2126. *host to memory.  Ptrbuff[] points to string in
  2127. *input buffer which is a command to output s1/s9
  2128. *records from the host ("cat filename" for unix).
  2129. *    Returns error and address if it can't write
  2130. *to a particular location.
  2131. **********
  2132. *   verify(ptrbuff[]) - Verify memory from load
  2133. *command.  Ptrbuff[] is same as for load.
  2134. **********
  2135. VERIFY    CLR  TMP2
  2136.           INC  TMP2      flagt1 = 1 = verify
  2137.           BRA  LOAD1
  2138. LOAD      CLR  TMP2      flagt1 = 0 = load
  2139.  
  2140.  
  2141. *a=wskip();
  2142. *if(a = cr) goto transparent mode;
  2143. *if(t option) hostdev = iodev;
  2144.  
  2145. LOAD1     JSR  WSKIP
  2146.           CMPA #$0D
  2147.           BNE  LOAD1A
  2148.           JMP  HOST      go to host if no args
  2149. LOAD1A    JSR  UPCASE
  2150.           CMPA #'T       look for t option
  2151.           BNE  LOAD1B    jump not t option
  2152.           JSR  INCBUFF
  2153.           JSR  READBUFF  get next character
  2154.           JSR  DECBUFF
  2155.           CMPA #$0D
  2156.           BNE  LOAD1B    jump if not t option
  2157.           CLR  AUTOLF
  2158.           LDAA IODEV
  2159.           STAA HOSTDEV   set host port = terminal
  2160.           BRA  LOAD6     go wait for s1 records
  2161.  
  2162. *else while(not cr)
  2163. *     read character from input buffer;
  2164. *     send character to host;
  2165.  
  2166. LOAD1B    CLR  AUTOLF
  2167.           JSR  HOSTCO    connect sci (evb board)
  2168.           JSR  HOSTINIT  initialize host port
  2169. LOAD2     JSR  READBUFF  get next char
  2170.           JSR  INCBUFF
  2171.           PSHA           save char
  2172.           JSR  HOSTOUT   output to host
  2173.           JSR  OUTPUT    echo to terminal
  2174.           PULA
  2175.           CMPA #$0D
  2176.           BNE  LOAD2     jump if not cr
  2177.  
  2178. *repeat:
  2179. *      if(hostdev != iodev) check abort;
  2180. *      a = hostin();
  2181. *      if(a = 'S')
  2182. *          a = hostin;
  2183. *          if(a = '9')
  2184. *              read rest of record;
  2185. *              return(done);
  2186. *          if(a = '1')
  2187. *              checksum = 0;
  2188. *              byte(); b = shftreg+1;     /* byte count */
  2189. *              byte(); byte(); x = shftreg; /* base addr*/
  2190. *              do
  2191. *                  byte();
  2192. *                  if(flagt1 = 0)
  2193. *                        x[0] = shftreg+1
  2194. *                  if(x[0] != shftreg+1)
  2195. *                         return("rom-(x)");
  2196. *                  x++; b--;
  2197. *              until(b = 0)
  2198.  
  2199. LOAD6     EQU  *
  2200.           LDAA HOSTDEV
  2201.           CMPA IODEV
  2202.           BEQ  LOAD65    jump if hostdev=iodev
  2203.           JSR  CHKABRT   check for abort
  2204. LOAD65    JSR  HOSTIN    read host
  2205.           TSTA
  2206.           BEQ  LOAD6     jump if no input
  2207.           CMPA #'S
  2208.           BNE  LOAD6     jump if not S
  2209. LOAD7     JSR  HOSTIN    read host
  2210.           TSTA
  2211.           BEQ  LOAD7     jump if no input
  2212.           CMPA #'9
  2213.           BNE  LOAD8     jump if not S9
  2214.           JSR  BYTE
  2215.           LDAB SHFTREG+1 b = byte count
  2216. LOAD75    JSR  BYTE
  2217.           DECB
  2218.           BNE  LOAD75    loop until end of record
  2219.           INC  AUTOLF    turn on autolf
  2220.           JSR  TARGCO    disconnect sci (evb)
  2221.           LDX  #MSG11    "done"
  2222.           JSR  OUTSTRG
  2223.           RTS
  2224. LOAD8     CMPA #'1
  2225.           BNE  LOAD6     jump if not S1
  2226.           CLR  TMP4      clear checksum
  2227.           JSR  BYTE
  2228.           LDAB SHFTREG+1
  2229.           SUBB #$2       b = byte count
  2230.           JSR  BYTE
  2231.           JSR  BYTE
  2232.           LDX  SHFTREG   x = base address
  2233.           DEX
  2234. LOAD10    JSR  BYTE      get next byte
  2235.           INX
  2236.           DECB           check byte count
  2237.           BEQ  LOAD12    if 0, go do checksum
  2238.           LDAA SHFTREG+1
  2239.           TST  TMP2
  2240.           BNE  LOAD11    jump if verify
  2241.           STAA 0,X       load only
  2242. LOAD11    CMPA 0,X       verify ram location
  2243.           BEQ  LOAD10    jump if ram ok
  2244.           STX  PTR3      save error address
  2245.           INC  AUTOLF    turn on autolf
  2246.           JSR  TARGCO    disconnect sci(evb)
  2247.           JSR  OUTCRLF
  2248.           LDX  #MSG13    "error addr"
  2249.           JSR  OUTSTRG
  2250.           LDX  #PTR3
  2251.           JSR  OUT2BSP   address
  2252.           RTS
  2253. LOAD12    LDAA TMP4
  2254.           INCA           do checksum
  2255.           BNE  LOAD13    jump if s1 record okay
  2256.           JMP  LOAD6
  2257. LOAD13    INC  AUTOLF
  2258.           JSR  TARGCO    disconnect sci(evb)
  2259.           JSR  OUTCRLF
  2260.           LDX  #MSG12    "checksum error"
  2261.           JSR  OUTSTRG
  2262.           RTS
  2263.  
  2264. **********
  2265. *  byte() -  Read 2 ascii bytes from host and
  2266. *convert to one hex byte.  Returns byte
  2267. *shifted into shftreg and added to tmp4.
  2268. **********
  2269. BYTE      PSHB
  2270.           PSHX
  2271. BYTE0     JSR  HOSTIN    read host (1st byte)
  2272.           TSTA
  2273.           BEQ  BYTE0     loop until input
  2274.           JSR  HEXBIN
  2275. BYTE1     JSR  HOSTIN    read host (2nd byte)
  2276.           TSTA
  2277.           BEQ  BYTE1     loop until input
  2278.           JSR  HEXBIN
  2279.           LDAA SHFTREG+1
  2280.           ADDA TMP4
  2281.           STAA TMP4      add to checksum
  2282.           PULX
  2283.           PULB
  2284.           RTS
  2285.  
  2286.  
  2287. *******************************************
  2288. *   MEMORY [<addr>]
  2289. *   [<addr>]/
  2290. * Opens memory and allows user to modify the
  2291. *contents at <addr> or the last opened location.
  2292. *    Subcommands:
  2293. * [<data>]<cr> - Close current location and exit.
  2294. * [<data>]<lf> - Close current and open next.
  2295. * [<data>]<^> - Close current and open previous.
  2296. * [<data>]<sp> - Close current and open next.
  2297. * [<data>]/ - Reopen current location.
  2298. *     The contents of the current location is only
  2299. *  changed if valid data is entered before each
  2300. *  subcommand.
  2301. * [<addr>]O - Compute relative offset from current
  2302. *     location to <addr>.  The current location must
  2303. *     be the address of the offset byte.
  2304. **********
  2305. *a = wskip();
  2306. *if(a != cr)
  2307. *     a = buffarg();
  2308. *     if(a != cr) return(bad argument);
  2309. *     if(countu1 != 0) ptrmem[] = shftreg;
  2310.  
  2311. MEMORY   JSR  WSKIP
  2312.          CMPA #$D
  2313.          BEQ  MEM1      jump if cr
  2314.          JSR  BUFFARG
  2315.          JSR  WSKIP
  2316.          CMPA #$D
  2317.          BEQ  MSLASH    jump if cr
  2318.          LDX  #MSG9     "bad argument"
  2319.          JSR  OUTSTRG
  2320.          RTS
  2321. MSLASH   TST  COUNT
  2322.          BEQ  MEM1      jump if no argument
  2323.          LDX  SHFTREG
  2324.          STX  PTRMEM    update "current location"
  2325.  
  2326. **********
  2327. * Subcommands
  2328. **********
  2329. *outcrlf();
  2330. *out2bsp(ptrmem[]);
  2331. *out1bsp(ptrmem[0]);
  2332.  
  2333. MEM1     JSR  OUTCRLF
  2334. MEM2     LDX  #PTRMEM
  2335.          JSR  OUT2BSP   output address
  2336. MEM3     LDX  PTRMEM
  2337.          JSR  OUT1BSP   output contents
  2338.          CLR  SHFTREG
  2339.          CLR  SHFTREG+1
  2340. *while 1
  2341. *a = termarg();
  2342. *     switch(a)
  2343. *          case(space):
  2344. *             chgbyt();
  2345. *             ptrmem[]++;
  2346. *          case(linefeed):
  2347. *             chgbyt();
  2348. *             ptrmem[]++;
  2349. *          case(up arrow):
  2350. *          case(backspace):
  2351. *               chgbyt();
  2352. *               ptrmem[]--;
  2353. *          case("/"):
  2354. *               chgbyt();
  2355. *               outcrlf();
  2356. *          case(O):
  2357. *               d = ptrmem[0] - (shftreg);
  2358. *               if($80 < d < $ff81)
  2359. *                    print(out of range);
  2360. *               countt1 = d-1;
  2361. *               out1bsp(countt1);
  2362. *          case(carriage return):
  2363. *               chgbyt();
  2364. *               return;
  2365. *          default: return(command?)
  2366.  
  2367. MEM4     JSR  TERMARG
  2368.          JSR  UPCASE
  2369.          LDX  PTRMEM
  2370.          CMPA #$20
  2371.          BEQ  MEMSP     jump if space
  2372.          CMPA #$0A
  2373.          BEQ  MEMLF     jump if linefeed
  2374.          CMPA #$5E
  2375.          BEQ  MEMUA     jump if up arrow
  2376.          CMPA #$08
  2377.          BEQ  MEMBS     jump if backspace
  2378.          CMPA #'/'
  2379.          BEQ  MEMSL     jump if /
  2380.          CMPA #'O'
  2381.          BEQ  MEMOFF    jump if O
  2382.          CMPA #$0D
  2383.          BEQ  MEMCR     jump if carriage ret
  2384.          LDX  #MSG8     "command?"
  2385.          JSR  OUTSTRG
  2386.          JMP  MEM1
  2387. MEMSP    JSR  CHGBYT
  2388.          INX
  2389.          STX  PTRMEM
  2390.          JMP  MEM3      output contents
  2391. MEMLF    JSR  CHGBYT
  2392.          INX
  2393.          STX  PTRMEM
  2394.          JMP  MEM2      output addr, contents
  2395. MEMUA    EQU  *
  2396. MEMBS    JSR  CHGBYT
  2397.          DEX
  2398.          STX  PTRMEM
  2399.          JMP  MEM1      output cr, addr, contents
  2400. MEMSL    JSR  CHGBYT
  2401.          JMP  MEM1      output cr, addr, contents
  2402. MEMOFF   LDD  SHFTREG   destination addr
  2403.          SUBD PTRMEM
  2404.          CMPA #$0
  2405.          BNE  MEMOFF1   jump if not 0
  2406.          CMPB #$80
  2407.          BLS  MEMOFF3   jump if in range
  2408.          BRA  MEMOFF2   out of range
  2409. MEMOFF1  CMPA #$FF
  2410.          BNE  MEMOFF2   out of range
  2411.          CMPB #$81
  2412.          BHS  MEMOFF3   in range
  2413. MEMOFF2  LDX  #MSG3     "Too long"
  2414.          JSR  OUTSTRG
  2415.          JMP  MEM1      output cr, addr, contents
  2416. MEMOFF3  SUBD #$1       b now has offset
  2417.          STAB TMP4
  2418.          JSR  OUTSPAC
  2419.          LDX  #TMP4
  2420.          JSR  OUT1BSP   output offset
  2421.          JMP  MEM1      output cr, addr, contents
  2422. MEMCR    JSR  CHGBYT
  2423.          RTS            exit task
  2424.  
  2425.  
  2426. **********
  2427. *   move <src1> <src2> [<dest>]  - move
  2428. *block at <src1> to <src2> to <dest>.
  2429. *  Moves block 1 byte up if no <dest>.
  2430. **********
  2431. *a = buffarg();
  2432. *if(countu1 = 0) return(bad argument);
  2433. *if( !wchek(a) ) return(bad argument);
  2434. *ptr1 = shftreg;         /* src1 */
  2435.  
  2436. MOVE     EQU  *
  2437.          JSR  BUFFARG
  2438.          TST  COUNT
  2439.          BEQ  MOVERR    jump if no arg
  2440.          JSR  WCHEK
  2441.          BNE  MOVERR    jump if no delim
  2442.          LDX  SHFTREG   src1
  2443.          STX  PTR1
  2444.  
  2445. *a = buffarg();
  2446. *if(countu1 = 0) return(bad argument);
  2447. *if( !dchek(a) ) return(bad argument);
  2448. *ptr2 = shftreg;         /* src2 */
  2449.  
  2450.          JSR  BUFFARG
  2451.          TST  COUNT
  2452.          BEQ  MOVERR    jump if no arg
  2453.          JSR  DCHEK
  2454.          BNE  MOVERR    jump if no delim
  2455.          LDX  SHFTREG   src2
  2456.          STX  PTR2
  2457.  
  2458. *a = buffarg();
  2459. *a = wskip();
  2460. *if(a != cr) return(bad argument);
  2461. *if(countu1 != 0) tmp2 = shftreg;  /* dest */
  2462. *else tmp2 = ptr1 + 1;
  2463.  
  2464.          JSR  BUFFARG
  2465.          JSR  WSKIP
  2466.          CMPA #$0D
  2467.          BNE  MOVERR    jump if not cr
  2468.          TST  COUNT
  2469.          BEQ  MOVE1     jump if no arg
  2470.          LDX  SHFTREG   dest
  2471.          BRA  MOVE2
  2472. MOVERR   LDX  #MSG9     "bad argument"
  2473.          JSR  OUTSTRG
  2474.          RTS
  2475. MOVE1    LDX  PTR1
  2476.          INX            default dest
  2477. MOVE2    STX  PTR3
  2478.  
  2479. *if(src1 < dest <= src2)
  2480. *     dest = dest+(src2-src1);
  2481. *     for(x = src2; x = src1; x--)
  2482. *          dest[0]-- = x[0]--;
  2483.  
  2484.          LDX  PTR3        dest
  2485.          CPX  PTR1        src1
  2486.          BLS  MOVE3       jump if dest =< src1
  2487.          CPX  PTR2        src2
  2488.          BHI  MOVE3       jump if dest > src2
  2489.          LDD  PTR2
  2490.          SUBD PTR1
  2491.          ADDD PTR3
  2492.          STD  PTR3        dest = dest+(src2-src1)
  2493.          LDX  PTR2
  2494. MOVELP1  JSR  CHKABRT     check for abort
  2495.          LDAA ,X          char at src2
  2496.          PSHX
  2497.          LDX  PTR3
  2498.          CPX  #$B600      jump if not eeprom
  2499.          BLO  MOVEA
  2500.          CPX  #$B7FF      jump if not eeprom
  2501.          BHI  MOVEA
  2502.          JSR  MOVPROG     program eeprom
  2503. MOVEA    STAA ,X          dest
  2504.          DEX
  2505.          STX  PTR3
  2506.          PULX
  2507.          CPX  PTR1
  2508.          BEQ  MOVRTS
  2509.          DEX
  2510.          BRA  MOVELP1     Loop SRC2 - SRC1 times
  2511. *
  2512. * else
  2513. *     for(x=src1; x=src2; x++)
  2514. *          dest[0]++ = x[0]++;
  2515.  
  2516.  
  2517. MOVE3    LDX  PTR1        srce1
  2518. MOVELP2  JSR  CHKABRT     check for abort
  2519.          LDAA ,X
  2520.          PSHX
  2521.          LDX  PTR3        dest
  2522.          CPX  #$B600      jump if not eeprom
  2523.          BLO  MOVEB
  2524.          CPX  #$B7FF      jump if not eeprom
  2525.          BHI  MOVEB
  2526.          JSR  MOVPROG     program eeprom
  2527. MOVEB    STAA ,X
  2528.          INX
  2529.          STX  PTR3
  2530.          PULX
  2531.          CPX  PTR2
  2532.          BEQ  MOVRTS
  2533.          INX
  2534.          BRA  MOVELP2      Loop SRC2-SRC1 times
  2535. MOVRTS     RTS
  2536.  
  2537. *************
  2538. *   MOVPROG - Program eeprom location in X with
  2539. *       data in A.
  2540. *************
  2541. MOVPROG  PSHB
  2542.          PSHX
  2543.          LDAB #$02
  2544.          STAB PPROG       set eelat
  2545.          STAA ,X
  2546.          LDAB #$03
  2547.          BNE  ACL4
  2548.          CLRB             fail safe
  2549. ACL4     STAB PPROG       set pgm
  2550.          LDX  #$0D06
  2551. MOVEDLY  DEX
  2552.          BNE  MOVEDLY     delay 10 ms at E = 2 MHz
  2553.          LDAB #$00
  2554.          STAB PPROG
  2555.          PULX
  2556.          PULB
  2557.          RTS
  2558.  
  2559.  
  2560. **********
  2561. *   register [<name>]  - prints the user regs
  2562. *and opens them for modification.  <name> is
  2563. *the first register opened (default = P).
  2564. *   Subcommands:
  2565. * [<nn>]<space>  Opens the next register.
  2566. * [<nn>]<cr>     Return.
  2567. *    The register value is only changed if
  2568. *    <nn> is entered before the subcommand.
  2569. **********
  2570. *x[] = reglist
  2571. *a = wskip(); a = upcase(a);
  2572. *if(a != cr)
  2573. *     while( a != x[0] )
  2574. *          if( x[0] = "s") return(bad argument);
  2575. *          x[]++;
  2576. *     incbuff(); a = wskip();
  2577. *     if(a != cr) return(bad argument);
  2578.  
  2579. REGISTER LDX  #REGLIST
  2580.          JSR  WSKIP       a = first char of arg
  2581.          JSR  UPCASE      convert to upper case
  2582.          CMPA #$D
  2583.          BEQ  REG4        jump if no argument
  2584. REG1     CMPA 0,X
  2585.          BEQ  REG3
  2586.          LDAB 0,X
  2587.          INX
  2588.          CMPB #'S'
  2589.          BNE  REG1        jump if not "s"
  2590. REG2     LDX  #MSG9       "bad argument"
  2591.          JSR  OUTSTRG
  2592.          RTS
  2593. REG3     PSHX
  2594.          JSR  INCBUFF
  2595.          JSR  WSKIP       next char after arg
  2596.          CMPA #$D
  2597.          PULX
  2598.          BNE  REG2        jump if not cr
  2599.  
  2600. *rprint();
  2601. *     while(x[0] != "s")
  2602. *          rprnt1(x);
  2603. *          a = termarg();    /* read from terminal */
  2604. *          if( ! dchek(a) ) return(bad argument);
  2605. *          if(countu1 != 0)
  2606. *               if(x[14] = 1)
  2607. *                    regs[x[7]++ = shftreg;
  2608. *               regs[x[7]] = shftreg+1;
  2609. *          if(a = cr) break;
  2610. *return;
  2611.  
  2612. REG4     JSR  RPRINT      print all registers
  2613. REG5     JSR  OUTCRLF
  2614.          JSR  RPRNT1      print reg name
  2615.          CLR  SHFTREG
  2616.          CLR  SHFTREG+1
  2617.          JSR  TERMARG     read subcommand
  2618.          JSR  DCHEK
  2619.          BEQ  REG6        jump if delimeter
  2620.          LDX  #MSG9       "bad argument"
  2621.          JSR  OUTSTRG
  2622.          RTS
  2623. REG6     PSHA
  2624.          PSHX
  2625.          TST  COUNT
  2626.          BEQ  REG8        jump if no input
  2627.          LDAB 7,X         get reg offset
  2628.          LDAA 14,X        byte size
  2629.          LDX  #REGS       user registers
  2630.          ABX
  2631.          TSTA
  2632.          BEQ  REG7        jump if 1 byte reg
  2633.          LDAA SHFTREG
  2634.          STAA 0,X         put in top byte
  2635.          INX
  2636. REG7     LDAA SHFTREG+1
  2637.          STAA 0,X         put in bottom byte
  2638. REG8     PULX
  2639.          PULA
  2640.          LDAB 0,X         CHECK FOR REGISTER S
  2641.          CMPB #'S'
  2642.          BEQ  REG9        jump if "s"
  2643.          INX              point to next register
  2644.          CMPA #$D
  2645.          BNE  REG5        jump if not cr
  2646. REG9     RTS
  2647.  
  2648. PAGE1   EQU  $00     values for page opcodes
  2649. PAGE2   EQU  $18
  2650. PAGE3   EQU  $1A
  2651. PAGE4   EQU  $CD
  2652. IMMED   EQU  $0      addressing modes
  2653. INDX    EQU  $1
  2654. INDY    EQU  $2
  2655. LIMMED  EQU  $3      (long immediate)
  2656. OTHER   EQU  $4
  2657.  
  2658. *** Rename variables for assem/disassem ***
  2659. AMODE   EQU  TMP2    addressing mode
  2660. YFLAG   EQU  TMP3
  2661. PNORM   EQU  TMP4    page for normal opcode
  2662. OLDPC   EQU  PTRMEM
  2663. PC      EQU  PTR1    program counter
  2664. PX      EQU  PTR2    page for x indexed
  2665. PY      EQU  PTR2+1  page for y indexed
  2666. BASEOP  EQU  PTR3    base opcode
  2667. CLASS   EQU  PTR3+1  class
  2668. DISPC   EQU  PTR4    pc for disassembler
  2669. BRADDR  EQU  PTR5    relative branch offset
  2670. MNEPTR  EQU  PTR6    pointer to table for dis
  2671. ASSCOMM EQU  PTR7    subcommand for assembler
  2672.  
  2673. *** Error messages for assembler ***
  2674. MSGDIR  FDB  #MSGA1   message table index
  2675.         FDB  #MSGA2
  2676.         FDB  #MSGA3
  2677.         FDB  #MSGA4
  2678.         FDB  #MSGA5
  2679.         FDB  #MSGA6
  2680.         FDB  #MSGA7
  2681.         FDB  #MSGA8
  2682.         FDB  #MSGA9
  2683. MSGA1   FCC  'Immediate mode illegal'
  2684.         FCB  EOT
  2685. MSGA2   FCC  'Error in mnemonic table'
  2686.         FCB  EOT
  2687. MSGA3   FCC  'Illegal bit op'
  2688.         FCB  EOT
  2689. MSGA4   FCC  'Bad argument'
  2690.         FCB  EOT
  2691. MSGA5   FCC  'Mnemonic not found'
  2692.         FCB  EOT
  2693. MSGA6   FCC  'Unknown addressing mode'
  2694.         FCB  EOT
  2695. MSGA7   FCC  'Indexed addressing assumed'
  2696.         FCB  EOT
  2697. MSGA8   FCC  'Syntax error'
  2698.         FCB  EOT
  2699. MSGA9   FCC  'Branch out of range'
  2700.         FCB  EOT
  2701.  
  2702. ****************
  2703. *  assem(addr) -68HC11 line assembler/disassembler.
  2704. *       This routine will disassemble the opcode at
  2705. *<addr> and then allow the user to enter a line for
  2706. *assembly. Rules for assembly are as follows:
  2707. * -A '#' sign indicates immediate addressing.
  2708. * -A ',' (comma) indicates indexed addressing
  2709. *       and the next character must be X or Y.
  2710. * -All arguments are assumed to be hex and the
  2711. *       '$' sign shouldn't be used.
  2712. * -Arguments should be separated by 1 or more
  2713. *       spaces or tabs.
  2714. * -Any input after the required number of
  2715. *       arguments is ignored.
  2716. * -Upper or lower case makes no difference.
  2717. *
  2718. *       To signify end of input line, the following
  2719. *commands are available and have the indicated action:
  2720. *   <cr>  -Carriage return finds the next opcode for
  2721. *          assembly.  If there was no assembly input,
  2722. *          the next opcode disassembled is retrieved
  2723. *          from the disassembler.
  2724. *   <lf>  -Linefeed works the same as carriage return
  2725. *          except if there was no assembly input, the
  2726. *          <addr> is incremented and the next <addr> is
  2727. *          disassembled.
  2728. *    '^'  -Up arrow decrements <addr> and the previous
  2729. *          address is then disassembled.
  2730. *    '/'  -Slash redisassembles the current address.
  2731. *
  2732. *       To exit the assembler use CONTROL A.  Of course
  2733. *control X and DEL will also allow you to abort.
  2734. **********
  2735. *oldpc = rambase;
  2736. *a = wskip();
  2737. *if (a != cr)
  2738. *   buffarg()
  2739. *   a = wskip();
  2740. *   if ( a != cr ) return(error);
  2741. *   oldpc = a;
  2742.  
  2743. ASSEM   EQU  *
  2744.         LDX  #RAMBS
  2745.         STX  OLDPC
  2746.         JSR  WSKIP
  2747.         CMPA #$0D
  2748.         BEQ  ASSLOOP jump if no argument
  2749.         JSR  BUFFARG
  2750.         JSR  WSKIP
  2751.         CMPA #$0D
  2752.         BEQ  ASSEM1  jump if argument ok
  2753.         LDX  #MSGA4  "bad argument"
  2754.         JSR  OUTSTRG
  2755.         RTS
  2756. ASSEM1  LDX  SHFTREG
  2757.         STX  OLDPC
  2758.  
  2759. *repeat
  2760. *  pc = oldpc;
  2761. *  out2bsp(pc);
  2762. *  disassem();
  2763. *  a=readln();
  2764. *  asscomm = a;  /* save command */
  2765. *  if(a == ('^' or '/')) outcrlf;
  2766. *  if(a == 0) return(error);
  2767.  
  2768. ASSLOOP LDX  OLDPC
  2769.         STX  PC
  2770.         JSR  OUTCRLF
  2771.         LDX  #PC
  2772.         JSR  OUT2BSP   output the address
  2773.         JSR  DISASSM   disassemble opcode
  2774.         JSR  OUTCRLF
  2775.         JSR  OUTSPAC
  2776.         JSR  OUTSPAC
  2777.         JSR  OUTSPAC
  2778.         JSR  OUTSPAC
  2779.         LDAA #PROMPT   prompt user
  2780.         JSR  OUTA      output prompt character
  2781.         JSR  READLN    read input for assembly
  2782.         STAA ASSCOMM
  2783.         CMPA #'^'
  2784.         BEQ  ASSLP0    jump if up arrow
  2785.         CMPA #'/'
  2786.         BEQ  ASSLP0    jump if slash
  2787.         CMPA #$00
  2788.         BNE  ASSLP1    jump if none of above
  2789.         RTS            return if bad input
  2790. ASSLP0  JSR  OUTCRLF
  2791. ASSLP1  EQU  *
  2792.         JSR  OUTSPAC
  2793.         JSR  OUTSPAC
  2794.         JSR  OUTSPAC
  2795.         JSR  OUTSPAC
  2796.         JSR  OUTSPAC
  2797.  
  2798. *  b = parse(input); /* get mnemonic */
  2799. *  if(b > 5) print("not found"); asscomm='/';
  2800. *  elseif(b >= 1)
  2801. *     msrch();
  2802. *     if(class==$FF)
  2803. *        print("not found"); asscomm='/';
  2804. *     else
  2805. *        a = doop(opcode,class);
  2806. *        if(a == 0) dispc=0;
  2807. *        else process error; asscomm='/';
  2808.  
  2809.         JSR  PARSE
  2810.         CMPB #$5
  2811.         BLE  ASSLP2  jump if mnemonic <= 5 chars
  2812.         LDX  #MSGA5  "mnemonic not found"
  2813.         JSR  OUTSTRG
  2814.         BRA  ASSLP5
  2815. ASSLP2  EQU  *
  2816.         CMPB #$0
  2817.         BEQ  ASSLP10 jump if no input
  2818.         JSR  MSRCH
  2819.         LDAA CLASS
  2820.         CMPA #$FF
  2821.         BNE  ASSLP3
  2822.         LDX  #MSGA5  "mnemonic not found"
  2823.         JSR  OUTSTRG
  2824.         BRA  ASSLP5
  2825. ASSLP3  JSR  DOOP
  2826.         CMPA #$00
  2827.         BNE  ASSLP4  jump if doop error
  2828.         LDX  #$00
  2829.         STX  DISPC   indicate good assembly
  2830.         BRA  ASSLP10
  2831. ASSLP4  DECA         a = error message index
  2832.         TAB
  2833.         LDX  #MSGDIR
  2834.         ABX
  2835.         ABX
  2836.         LDX  0,X
  2837.         JSR  OUTSTRG output error message
  2838. ASSLP5  CLR  ASSCOMM error command
  2839.  
  2840. *  /* compute next address - asscomm holds subcommand
  2841. *     and dispc indicates if valid assembly occured. */
  2842. *  if(asscomm=='^') oldpc -= 1;
  2843. *  if(asscomm==(lf or cr)
  2844. *     if(dispc==0) oldpc=pc;
  2845. *     else
  2846. *        if(asscomm==lf) dispc=oldpc+1;
  2847. *        oldpc=dispc;
  2848. *until(eot)
  2849.  
  2850.  
  2851. ASSLP10 EQU  *
  2852.         LDAA ASSCOMM
  2853.         CMPA #'^'
  2854.         BNE  ASSLP11    jump if not up arrow
  2855.         LDX  OLDPC
  2856.         DEX
  2857.         STX  OLDPC      back up
  2858.         BRA  ASSLP15
  2859. ASSLP11 CMPA #$0A
  2860.         BEQ  ASSLP12    jump if linefeed
  2861.         CMPA #$0D
  2862.         BNE  ASSLP15    jump if not cr
  2863. ASSLP12 LDX  DISPC
  2864.         BNE  ASSLP13    jump if dispc != 0
  2865.         LDX  PC
  2866.         STX  OLDPC
  2867.         BRA  ASSLP15
  2868. ASSLP13 CMPA #$0A
  2869.         BNE  ASSLP14    jump if not linefeed
  2870.         LDX  OLDPC
  2871.         INX
  2872.         STX  DISPC
  2873. ASSLP14 LDX  DISPC
  2874.         STX  OLDPC
  2875. ASSLP15 JMP  ASSLOOP
  2876.  
  2877. ****************
  2878. *  readln() --- Read input from terminal into buffer
  2879. * until a command character is read (cr,lf,/,^).
  2880. * If more chars are typed than the buffer will hold,
  2881. * the extra characters are overwritten on the end.
  2882. *  On exit: b=number of chars read, a=0 if quit,
  2883. * else a=next command.
  2884. ****************
  2885. *for(b==0;b<=bufflng;b++) inbuff[b] = cr;
  2886.  
  2887. READLN  CLRB
  2888.         LDAA #$0D    carriage ret
  2889. RLN0    LDX  #INBUFF
  2890.         ABX
  2891.         STAA 0,X     initialize input buffer
  2892.         INCB
  2893.         CMPB #BUFFLNG
  2894.         BLT  RLN0
  2895. *b=0;
  2896. *repeat
  2897. *  if(a == (ctla, cntlc, cntld, cntlx, del))
  2898. *     return(a=0);
  2899. *  if(a == backspace)
  2900. *     if(b > 0) b--;
  2901. *     else b=0;
  2902. *  else  inbuff[b] = upcase(a);
  2903. *  if(b < bufflng) b++;
  2904. *until (a == (cr,lf,^,/))
  2905. *return(a);
  2906.  
  2907.         CLRB
  2908. RLN1    JSR  INCHAR
  2909.         CMPA #DEL    Delete
  2910.         BEQ  RLNQUIT
  2911.         CMPA #CTLX   Control X
  2912.         BEQ  RLNQUIT
  2913.         CMPA #CTLA   Control A
  2914.         BEQ  RLNQUIT
  2915.         CMPA #$03    Control C
  2916.         BEQ  RLNQUIT
  2917.         CMPA #$04    Control D
  2918.         BEQ  RLNQUIT
  2919.         CMPA #$08    backspace
  2920.         BNE  RLN2
  2921.         DECB
  2922.         BGT  RLN1
  2923.         BRA  READLN  start over
  2924. RLN2    LDX  #INBUFF
  2925.         ABX
  2926.         JSR  UPCASE
  2927.         STAA 0,X     put char in buffer
  2928.         CMPB #BUFFLNG        max buffer length
  2929.         BGE  RLN3    jump if buffer full
  2930.         INCB         move buffer pointer
  2931. RLN3    JSR  ASSCHEK check for subcommand
  2932.         BNE  RLN1
  2933.         RTS
  2934. RLNQUIT CLRA         quit
  2935.         RTS          return
  2936.  
  2937.  
  2938. **********
  2939. *  parse() -parse out the mnemonic from INBUFF
  2940. * to COMBUFF. on exit: b=number of chars parsed.
  2941. **********
  2942. *combuff[3] = <space>;   initialize 4th character to space.
  2943. *ptrbuff[] = inbuff[];
  2944. *a=wskip();
  2945. *for (b = 0; b = 5; b++)
  2946. *   a=readbuff(); incbuff();
  2947. *   if (a = (cr,lf,^,/,wspace)) return(b);
  2948. *   combuff[b] = upcase(a);
  2949. *return(b);
  2950.  
  2951. PARSE   LDAA #$20
  2952.         STAA COMBUFF+3
  2953.         LDX  #INBUFF         initialize buffer ptr
  2954.         STX  PTR0
  2955.         JSR  WSKIP           find first character
  2956.         CLRB
  2957. PARSLP  JSR  READBUFF        read character
  2958.         JSR  INCBUFF
  2959.         JSR  WCHEK
  2960.         BEQ  PARSRT          jump if whitespace
  2961.         JSR  ASSCHEK
  2962.         BEQ  PARSRT          jump if end of line
  2963.         JSR  UPCASE          convert to upper case
  2964.         LDX  #COMBUFF
  2965.         ABX
  2966.         STAA 0,X             store in combuff
  2967.         INCB
  2968.         CMPB #$5
  2969.         BLE  PARSLP          loop 6 times
  2970. PARSRT  RTS
  2971.  
  2972.  
  2973. ****************
  2974. *  asschek() -perform compares for
  2975. * cr, lf, ^, /
  2976. ****************
  2977. ASSCHEK CMPA #$0A    linefeed
  2978.         BEQ  ASSCHK1
  2979.         CMPA #$0D    carriage ret
  2980.         BEQ  ASSCHK1
  2981.         CMPA #'^'    up arrow
  2982.         BEQ  ASSCHK1
  2983.         CMPA #'/'    slash
  2984. ASSCHK1 RTS
  2985.  
  2986.  
  2987. *********
  2988. *  msrch() --- Search MNETABL for mnemonic in COMBUFF.
  2989. *stores base opcode at baseop and class at class.
  2990. *  Class = FF if not found.
  2991. **********
  2992. *while ( != EOF )
  2993. *   if (COMBUFF[0-3] = MNETABL[0-3])
  2994. *      return(MNETABL[4],MNETABL[5]);
  2995. *   else *MNETABL =+ 6
  2996.  
  2997. MSRCH   LDX  #MNETABL        pointer to mnemonic table
  2998.         LDY  #COMBUFF        pointer to string
  2999.         BRA  MSRCH1
  3000. MSNEXT  EQU  *
  3001.         LDAB #6
  3002.         ABX                  point to next table entry
  3003. MSRCH1  LDAA 0,X             read table
  3004.         CMPA #EOT
  3005.         BNE  MSRCH2          jump if not end of table
  3006.         LDAA #$FF
  3007.         STAA CLASS           FF = not in table
  3008.         RTS
  3009. MSRCH2  CMPA 0,Y             op[0] = tabl[0] ?
  3010.         BNE  MSNEXT
  3011.         LDAA 1,X
  3012.         CMPA 1,Y             op[1] = tabl[1] ?
  3013.         BNE  MSNEXT
  3014.         LDAA 2,X
  3015.         CMPA 2,Y             op[2] = tabl[2] ?
  3016.         BNE  MSNEXT
  3017.         LDAA 3,X
  3018.         CMPA 3,Y             op[2] = tabl[2] ?
  3019.         BNE  MSNEXT
  3020.         LDD  4,X             opcode, class
  3021.         STAA BASEOP
  3022.         STAB CLASS
  3023.         RTS
  3024.  
  3025. **********
  3026. **   doop(baseop,class) --- process mnemonic.
  3027. **   on exit: a=error code corresponding to error
  3028. **                                     messages.
  3029. **********
  3030. *amode = OTHER; /* addressing mode */
  3031. *yflag = 0;     /* ynoimm, nlimm, and cpd flag */
  3032. *x[] = ptrbuff[]
  3033.  
  3034. DOOP    EQU  *
  3035.         LDAA #OTHER
  3036.         STAA AMODE   mode
  3037.         CLR  YFLAG
  3038.         LDX  PTR0
  3039.  
  3040. *while (*x != end of buffer)
  3041. *   if (x[0]++ == ',')
  3042. *      if (x[0] == 'y') amode = INDY;
  3043. *      else amod = INDX;
  3044. *      break;
  3045. *a = wskip()
  3046. *if( a == '#' ) amode = IMMED;
  3047.  
  3048. DOPLP1  CPX  #ENDBUFF (end of buffer)
  3049.         BEQ  DOOP1   jump if end of buffer
  3050.         LDD  0,X     read 2 chars from buffer
  3051.         INX          move pointer
  3052.         CMPA #','
  3053.         BNE  DOPLP1
  3054.         CMPB #'Y'    look for ",y"
  3055.         BNE  DOPLP2
  3056.         LDAA #INDY
  3057.         STAA AMODE
  3058.         BRA  DOOP1
  3059. DOPLP2  CMPB #'X'    look for ",x"
  3060.         BNE  DOOP1   jump if not x
  3061.         LDAA #INDX
  3062.         STAA AMODE
  3063.         BRA  DOOP1
  3064. DOOP1   JSR  WSKIP
  3065.         CMPA #'#'    look for immediate mode
  3066.         BNE  DOOP2
  3067.         JSR  INCBUFF point at argument
  3068.         LDAA #IMMED
  3069.         STAA AMODE
  3070. DOOP2   EQU  *
  3071.  
  3072. *switch(class)
  3073.         LDAB CLASS
  3074.         CMPB #P2INH
  3075.         BNE  DOSW1
  3076.         JMP  DOP2I
  3077. DOSW1   CMPB #INH
  3078.         BNE  DOSW2
  3079.         JMP  DOINH
  3080. DOSW2   CMPB #REL
  3081.         BNE  DOSW3
  3082.         JMP  DOREL
  3083. DOSW3   CMPB #LIMM
  3084.         BNE  DOSW4
  3085.         JMP  DOLIM
  3086. DOSW4   CMPB #NIMM
  3087.         BNE  DOSW5
  3088.         JMP  DONOI
  3089. DOSW5   CMPB #GEN
  3090.         BNE  DOSW6
  3091.         JMP  DOGENE
  3092. DOSW6   CMPB #GRP2
  3093.         BNE  DOSW7
  3094.         JMP  DOGRP
  3095. DOSW7   CMPB #CPD
  3096.         BNE  DOSW8
  3097.         JMP  DOCPD
  3098. DOSW8   CMPB #XNIMM
  3099.         BNE  DOSW9
  3100.         JMP  DOXNOI
  3101. DOSW9   CMPB #XLIMM
  3102.         BNE  DOSW10
  3103.         JMP  DOXLI
  3104. DOSW10  CMPB #YNIMM
  3105.         BNE  DOSW11
  3106.         JMP  DOYNOI
  3107. DOSW11  CMPB #YLIMM
  3108.         BNE  DOSW12
  3109.         JMP  DOYLI
  3110. DOSW12  CMPB #BTB
  3111.         BNE  DOSW13
  3112.         JMP  DOBTB
  3113. DOSW13  CMPB #SETCLR
  3114.         BNE  DODEF
  3115.         JMP  DOSET
  3116.  
  3117. *   default: return("error in mnemonic table");
  3118.  
  3119. DODEF   LDAA #$2
  3120.         RTS
  3121.  
  3122. *  case P2INH: emit(PAGE2)
  3123.  
  3124. DOP2I   LDAA #PAGE2
  3125.         JSR  EMIT
  3126.  
  3127. *  case INH: emit(baseop);
  3128. *       return(0);
  3129.  
  3130. DOINH   LDAA BASEOP
  3131.         JSR  EMIT
  3132.         CLRA
  3133.         RTS
  3134.  
  3135. *  case REL: a = assarg();
  3136. *            if(a=4) return(a);
  3137. *            d = address - pc + 2;
  3138. *            if ($7f >= d >= $ff82)
  3139. *               return (out of range);
  3140. *            emit(opcode);
  3141. *            emit(offset);
  3142. *            return(0);
  3143.  
  3144. DOREL   JSR  ASSARG
  3145.         CMPA #$04
  3146.         BNE  DOREL1  jump if arg ok
  3147.         RTS
  3148. DOREL1  LDD  SHFTREG get branch address
  3149.         LDX  PC      get program counter
  3150.         INX
  3151.         INX          point to end of opcode
  3152.         STX  BRADDR
  3153.         SUBD BRADDR  calculate offset
  3154.         STD  BRADDR  save result
  3155.         CMPD #$7F    in range ?
  3156.         BLS  DOREL2  jump if in range
  3157.         CMPD #$FF80
  3158.         BHS  DOREL2  jump if in range
  3159.         LDAA #$09    'Out of range'
  3160.         RTS
  3161. DOREL2  LDAA BASEOP
  3162.         JSR  EMIT    emit opcode
  3163.         LDAA BRADDR+1
  3164.         JSR  EMIT    emit offset
  3165.         CLRA         normal return
  3166.         RTS
  3167.  
  3168. *  case LIMM: if (amode == IMMED) amode = LIMMED;
  3169.  
  3170. DOLIM   LDAA AMODE
  3171.         CMPA #IMMED
  3172.         BNE  DONOI
  3173.         LDAA #LIMMED
  3174.         STAA AMODE
  3175.  
  3176. *  case NIMM: if (amode == IMMED)
  3177. *                return("Immediate mode illegal");
  3178.  
  3179. DONOI   LDAA AMODE
  3180.         CMPA #IMMED
  3181.         BNE  DOGENE  jump if not immediate
  3182.         LDAA #$1     "immediate mode illegal"
  3183.         RTS
  3184.  
  3185. *  case GEN: dogen(baseop,amode,PAGE1,PAGE1,PAGE2);
  3186. *            return;
  3187.  
  3188. DOGENE  LDAA #PAGE1
  3189.         STAA PNORM
  3190.         STAA PX
  3191.         LDAA #PAGE2
  3192.         STAA PY
  3193.         JSR  DOGEN
  3194.         RTS
  3195.  
  3196. *  case GRP2: if (amode == INDY)
  3197. *                emit(PAGE2);
  3198. *                amode = INDX;
  3199. *             if( amode == INDX )
  3200. *                doindx(baseop);
  3201. *             else a = assarg();
  3202. *                if(a=4) return(a);
  3203. *                emit(opcode+0x10);
  3204. *                emit(extended address);
  3205. *             return;
  3206.  
  3207. DOGRP   LDAA AMODE
  3208.         CMPA #INDY
  3209.         BNE  DOGRP1
  3210.         LDAA #PAGE2
  3211.         JSR  EMIT
  3212.         LDAA #INDX
  3213.         STAA AMODE
  3214. DOGRP1  EQU  *
  3215.         LDAA AMODE
  3216.         CMPA #INDX
  3217.         BNE  DOGRP2
  3218.         JSR  DOINDEX
  3219.         RTS
  3220. DOGRP2  EQU  *
  3221.         LDAA BASEOP
  3222.         ADDA #$10
  3223.         JSR  EMIT
  3224.         JSR  ASSARG
  3225.         CMPA #$04
  3226.         BEQ  DOGRPRT jump if bad arg
  3227.         LDD  SHFTREG extended address
  3228.         JSR  EMIT
  3229.         TBA
  3230.         JSR  EMIT
  3231.         CLRA
  3232. DOGRPRT RTS
  3233.  
  3234. *  case CPD: if (amode == IMMED)
  3235. *               amode = LIMMED; /* cpd */
  3236. *            if( amode == INDY ) yflag = 1;
  3237. *            dogen(baseop,amode,PAGE3,PAGE3,PAGE4);
  3238. *            return;
  3239.  
  3240. DOCPD   LDAA AMODE
  3241.         CMPA #IMMED
  3242.         BNE  DOCPD1
  3243.         LDAA #LIMMED
  3244.         STAA AMODE
  3245. DOCPD1  LDAA AMODE
  3246.         CMPA #INDY
  3247.         BNE  DOCPD2
  3248.         INC  YFLAG
  3249. DOCPD2  LDAA #PAGE3
  3250.         STAA PNORM
  3251.         STAA PX
  3252.         LDAA #PAGE4
  3253.         STAA PY
  3254.         JSR  DOGEN
  3255.         RTS
  3256.  
  3257. *  case XNIMM: if (amode == IMMED)      /* stx */
  3258. *                 return("Immediate mode illegal");
  3259.  
  3260. DOXNOI  LDAA AMODE
  3261.         CMPA #IMMED
  3262.         BNE  DOXLI
  3263.         LDAA #$1     "immediate mode illegal"
  3264.         RTS
  3265.  
  3266. *  case XLIMM: if (amode == IMMED)  /* cpx, ldx */
  3267. *                 amode = LIMMED;
  3268. *              dogen(baseop,amode,PAGE1,PAGE1,PAGE4);
  3269. *              return;
  3270.  
  3271. DOXLI   LDAA AMODE
  3272.         CMPA #IMMED
  3273.         BNE  DOXLI1
  3274.         LDAA #LIMMED
  3275.         STAA AMODE
  3276. DOXLI1  LDAA #PAGE1
  3277.         STAA PNORM
  3278.         STAA PX
  3279.         LDAA #PAGE4
  3280.         STAA PY
  3281.         JSR  DOGEN
  3282.         RTS
  3283.  
  3284. *  case YNIMM: if (amode == IMMED)      /* sty */
  3285. *                 return("Immediate mode illegal");
  3286.  
  3287. DOYNOI  LDAA AMODE
  3288.         CMPA #IMMED
  3289.         BNE  DOYLI
  3290.         LDAA #$1     "immediate mode illegal"
  3291.         RTS
  3292.  
  3293. *  case YLIMM: if (amode == INDY) yflag = 1;/* cpy, ldy */
  3294. *              if(amode == IMMED) amode = LIMMED;
  3295. *              dogen(opcode,amode,PAGE2,PAGE3,PAGE2);
  3296. *              return;
  3297.  
  3298. DOYLI   LDAA AMODE
  3299.         CMPA #INDY
  3300.         BNE  DOYLI1
  3301.         INC  YFLAG
  3302. DOYLI1  CMPA #IMMED
  3303.         BNE  DOYLI2
  3304.         LDAA #LIMMED
  3305.         STAA AMODE
  3306. DOYLI2  LDAA #PAGE2
  3307.         STAA PNORM
  3308.         STAA PY
  3309.         LDAA #PAGE3
  3310.         STAA PX
  3311.         JSR  DOGEN
  3312.         RTS
  3313.  
  3314. *  case BTB:        /* bset, bclr */
  3315. *  case SETCLR: a = bitop(baseop,amode,class);
  3316. *               if(a=0) return(a = 3);
  3317. *               if( amode == INDY )
  3318. *                  emit(PAGE2);
  3319. *                  amode = INDX;
  3320.  
  3321. DOBTB   EQU  *
  3322. DOSET   JSR  BITOP
  3323.         CMPA #$00
  3324.         BNE  DOSET1
  3325.         LDAA #$3     "illegal bit op"
  3326.         RTS
  3327. DOSET1  LDAA AMODE
  3328.         CMPA #INDY
  3329.         BNE  DOSET2
  3330.         LDAA #PAGE2
  3331.         JSR  EMIT
  3332.         LDAA #INDX
  3333.         STAA AMODE
  3334. DOSET2  EQU  *
  3335.  
  3336. *               emit(baseop);
  3337. *               a = assarg();
  3338. *               if(a = 4) return(a);
  3339. *               emit(index offset);
  3340. *               if( amode == INDX )
  3341. *                  Buffptr += 2;      /* skip ,x or ,y */
  3342.  
  3343.         LDAA BASEOP
  3344.         JSR  EMIT
  3345.         JSR  ASSARG
  3346.         CMPA #$04
  3347.         BNE  DOSET22         jump if arg ok
  3348.         RTS
  3349. DOSET22 LDAA SHFTREG+1       index offset
  3350.         JSR  EMIT
  3351.         LDAA AMODE
  3352.         CMPA #INDX
  3353.         BNE  DOSET3
  3354.         JSR  INCBUFF
  3355.         JSR  INCBUFF
  3356. DOSET3  EQU  *
  3357.  
  3358. *               a = assarg();
  3359. *               if(a = 4) return(a);
  3360. *               emit(mask);   /* mask */
  3361. *               if( class == SETCLR )
  3362. *                  return;
  3363.  
  3364.         JSR  ASSARG
  3365.         CMPA #$04
  3366.         BNE  DOSET33         jump if arg ok
  3367.         RTS
  3368. DOSET33 LDAA SHFTREG+1       mask
  3369.         JSR  EMIT
  3370.         LDAA CLASS
  3371.         CMPA #SETCLR
  3372.         BNE  DOSET4
  3373.         CLRA
  3374.         RTS
  3375. DOSET4  EQU  *
  3376.  
  3377. *               a = assarg();
  3378. *               if(a = 4) return(a);
  3379. *               d = (pc+1) - shftreg;
  3380. *               if ($7f >= d >= $ff82)
  3381. *                  return (out of range);
  3382. *               emit(branch offset);
  3383. *               return(0);
  3384.  
  3385.         JSR  ASSARG
  3386.         CMPA #$04
  3387.         BNE  DOSET5          jump if arg ok
  3388.         RTS
  3389. DOSET5  LDX  PC              program counter
  3390.         INX                  point to next inst
  3391.         STX  BRADDR          save pc value
  3392.         LDD  SHFTREG         get branch address
  3393.         SUBD BRADDR          calculate offset
  3394.         CMPD #$7F
  3395.         BLS  DOSET6          jump if in range
  3396.         CMPD #$FF80
  3397.         BHS  DOSET6          jump if in range
  3398.         CLRA
  3399.         JSR  EMIT
  3400.         LDAA #$09            'out of range'
  3401.         RTS
  3402. DOSET6  TBA                  offset
  3403.         JSR  EMIT
  3404.         CLRA
  3405.         RTS
  3406.  
  3407.  
  3408. **********
  3409. **   bitop(baseop,amode,class) --- adjust opcode on bit
  3410. **       manipulation instructions.  Returns opcode in a
  3411. **       or a = 0 if error
  3412. **********
  3413. *if( amode == INDX || amode == INDY ) return(op);
  3414. *if( class == SETCLR ) return(op-8);
  3415. *else if(class==BTB) return(op-12);
  3416. *else fatal("bitop");
  3417.  
  3418. BITOP   EQU  *
  3419.         LDAA AMODE
  3420.         LDAB CLASS
  3421.         CMPA #INDX
  3422.         BNE  BITOP1
  3423.         RTS
  3424. BITOP1  CMPA #INDY
  3425.         BNE  BITOP2  jump not indexed
  3426.         RTS
  3427. BITOP2  CMPB #SETCLR
  3428.         BNE  BITOP3  jump not bset,bclr
  3429.         LDAA BASEOP  get opcode
  3430.         SUBA #8
  3431.         STAA BASEOP
  3432.         RTS
  3433. BITOP3  CMPB #BTB
  3434.         BNE  BITOP4  jump not bit branch
  3435.         LDAA BASEOP  get opcode
  3436.         SUBA #12
  3437.         STAA BASEOP
  3438.         RTS
  3439. BITOP4  CLRA         0 = fatal bitop
  3440.         RTS
  3441.  
  3442. **********
  3443. **   dogen(baseop,mode,pnorm,px,py) - process
  3444. ** general addressing modes. Returns a = error #.
  3445. **********
  3446. *pnorm = page for normal addressing modes: IMM,DIR,EXT
  3447. *px = page for INDX addressing
  3448. *py = page for INDY addressing
  3449. *switch(amode)
  3450. DOGEN   LDAA AMODE
  3451.         CMPA #LIMMED
  3452.         BEQ  DOGLIM
  3453.         CMPA #IMMED
  3454.         BEQ  DOGIMM
  3455.         CMPA #INDY
  3456.         BEQ  DOGINDY
  3457.         CMPA #INDX
  3458.         BEQ  DOGINDX
  3459.         CMPA #OTHER
  3460.         BEQ  DOGOTH
  3461.  
  3462. *default: error("Unknown Addressing Mode");
  3463.  
  3464. DOGDEF  LDAA #$06        unknown addre...
  3465.         RTS
  3466.  
  3467. *case LIMMED: epage(pnorm);
  3468. *             emit(baseop);
  3469. *             a = assarg();
  3470. *             if(a = 4) return(a);
  3471. *             emit(2 bytes);
  3472. *             return(0);
  3473.  
  3474. DOGLIM  LDAA PNORM
  3475.         JSR  EPAGE
  3476. DOGLIM1 LDAA BASEOP
  3477.         JSR  EMIT
  3478.         JSR  ASSARG   get next argument
  3479.         CMPA #$04
  3480.         BNE  DOGLIM2   jump if arg ok
  3481.         RTS
  3482. DOGLIM2 LDD  SHFTREG
  3483.         JSR  EMIT
  3484.         TBA
  3485.         JSR  EMIT
  3486.         CLRA
  3487.         RTS
  3488.  
  3489. *case IMMED: epage(pnorm);
  3490. *            emit(baseop);
  3491. *            a = assarg();
  3492. *            if(a = 4) return(a);
  3493. *            emit(lobyte);
  3494. *            return(0);
  3495.  
  3496. DOGIMM  LDAA PNORM
  3497.         JSR  EPAGE
  3498.         LDAA BASEOP
  3499.         JSR  EMIT
  3500.         JSR  ASSARG
  3501.         CMPA #$04
  3502.         BNE  DOGIMM1   jump if arg ok
  3503.         RTS
  3504. DOGIMM1 LDAA SHFTREG+1
  3505.         JSR  EMIT
  3506.         CLRA
  3507.         RTS
  3508.  
  3509. *case INDY: epage(py);
  3510. *           a=doindex(op+0x20);
  3511. *           return(a);
  3512.  
  3513. DOGINDY LDAA PY
  3514.         JSR  EPAGE
  3515.         LDAA BASEOP
  3516.         ADDA #$20
  3517.         STAA BASEOP
  3518.         JSR  DOINDEX
  3519.         RTS
  3520.  
  3521. *case INDX: epage(px);
  3522. *           a=doindex(op+0x20);
  3523. *           return(a);
  3524.  
  3525. DOGINDX LDAA PX
  3526.         JSR  EPAGE
  3527.         LDAA BASEOP
  3528.         ADDA #$20
  3529.         STAA BASEOP
  3530.         JSR  DOINDEX
  3531.         RTS
  3532.  
  3533. *case OTHER: a = assarg();
  3534. *            if(a = 4) return(a);
  3535. *            epage(pnorm);
  3536. *            if(countu1 <= 2 digits)   /* direct */
  3537. *               emit(op+0x10);
  3538. *               emit(lobyte(Result));
  3539. *               return(0);
  3540. *            else    emit(op+0x30);    /* extended */
  3541. *               eword(Result);
  3542. *               return(0)
  3543.  
  3544. DOGOTH  JSR  ASSARG
  3545.         CMPA #$04
  3546.         BNE  DOGOTH0  jump if arg ok
  3547.         RTS
  3548. DOGOTH0 LDAA PNORM
  3549.         JSR  EPAGE
  3550.         LDAA COUNT
  3551.         CMPA #$2
  3552.         BGT  DOGOTH1
  3553.         LDAA BASEOP
  3554.         ADDA #$10            direct mode opcode
  3555.         JSR  EMIT
  3556.         LDAA SHFTREG+1
  3557.         JSR  EMIT
  3558.         CLRA
  3559.         RTS
  3560. DOGOTH1 LDAA BASEOP
  3561.         ADDA #$30            extended mode opcode
  3562.         JSR  EMIT
  3563.         LDD  SHFTREG
  3564.         JSR  EMIT
  3565.         TBA
  3566.         JSR  EMIT
  3567.         CLRA
  3568.         RTS
  3569.  
  3570. **********
  3571. **  doindex(op) --- handle all wierd stuff for
  3572. **   indexed addressing. Returns a = error number.
  3573. **********
  3574. *emit(baseop);
  3575. *a=assarg();
  3576. *if(a = 4) return(a);
  3577. *if( a != ',' ) return("Syntax");
  3578. *buffptr++
  3579. *a=readbuff()
  3580. *if( a != 'x' &&  != 'y') warn("Ind Addr Assumed");
  3581. *emit(lobyte);
  3582. *return(0);
  3583.  
  3584. DOINDEX LDAA BASEOP
  3585.         JSR  EMIT
  3586.         JSR  ASSARG
  3587.         CMPA #$04
  3588.         BNE  DOINDX0     jump if arg ok
  3589.         RTS
  3590. DOINDX0 CMPA #','
  3591.         BEQ  DOINDX1
  3592.         LDAA #$08        "syntax error"
  3593.         RTS
  3594. DOINDX1 JSR  INCBUFF
  3595.         JSR  READBUFF
  3596.         CMPA #'Y'
  3597.         BEQ  DOINDX2
  3598.         CMPA #'X'
  3599.         BEQ  DOINDX2
  3600.         LDX  MSGA7       "index addr assumed"
  3601.         JSR  OUTSTRG
  3602. DOINDX2 LDAA SHFTREG+1
  3603.         JSR  EMIT
  3604.         CLRA
  3605.         RTS
  3606.  
  3607. **********
  3608. **   assarg(); - get argument.  Returns a = 4 if bad
  3609. ** argument, else a = first non hex char.
  3610. **********
  3611. *a = buffarg()
  3612. *if(asschk(aa) && countu1 != 0) return(a);
  3613. *return(bad argument);
  3614.  
  3615. ASSARG  JSR  BUFFARG
  3616.         JSR  ASSCHEK   check for command
  3617.         BEQ  ASSARG1   jump if ok
  3618.         JSR  WCHEK     check for whitespace
  3619.         BNE  ASSARG2   jump if not ok
  3620. ASSARG1 TST  COUNT
  3621.         BEQ  ASSARG2   jump if no argument
  3622.         RTS
  3623. ASSARG2 LDAA #$04      bad argument
  3624.         RTS
  3625.  
  3626. **********
  3627. **  epage(a) --- emit page prebyte
  3628. **********
  3629. *if( a != PAGE1 ) emit(a);
  3630.  
  3631. EPAGE   CMPA #PAGE1
  3632.         BEQ  EPAGRT  jump if page 1
  3633.         JSR  EMIT
  3634. EPAGRT  RTS
  3635.  
  3636. **********
  3637. *   emit(a) --- emit contents of a
  3638. **********
  3639. EMIT    LDX  PC
  3640.         STAA 0,X
  3641.         JSR  OUT1BSP
  3642.         STX  PC
  3643.         RTS
  3644.  
  3645. *Mnemonic table for hc11 line assembler
  3646. NULL    EQU  $0      nothing
  3647. INH     EQU  $1      inherent
  3648. P2INH   EQU  $2      page 2 inherent
  3649. GEN     EQU  $3      general addressing
  3650. GRP2    EQU  $4      group 2
  3651. REL     EQU  $5      relative
  3652. IMM     EQU  $6      immediate
  3653. NIMM    EQU  $7      general except for immediate
  3654. LIMM    EQU  $8      2 byte immediate
  3655. XLIMM   EQU  $9      longimm for x
  3656. XNIMM   EQU  $10     no immediate for x
  3657. YLIMM   EQU  $11     longimm for y
  3658. YNIMM   EQU  $12     no immediate for y
  3659. BTB     EQU  $13     bit test and branch
  3660. SETCLR  EQU  $14     bit set or clear
  3661. CPD     EQU  $15     compare d
  3662. BTBD    EQU  $16     bit test and branch direct
  3663. SETCLRD EQU  $17     bit set or clear direct
  3664.  
  3665. **********
  3666. *   mnetabl - includes all '11 mnemonics, base opcodes,
  3667. * and type of instruction.  The assembler search routine
  3668. *depends on 4 characters for each mnemonic so that 3 char
  3669. *mnemonics are extended with a space and 5 char mnemonics
  3670. *are truncated.
  3671. **********
  3672.  
  3673. MNETABL EQU  *
  3674.         FCC  'ABA '   Mnemonic
  3675.         FCB  $1B     Base opcode
  3676.         FCB  INH     Class
  3677.         FCC  'ABX '
  3678.         FCB  $3A
  3679.         FCB  INH
  3680.         FCC  'ABY '
  3681.         FCB  $3A
  3682.         FCB  P2INH
  3683.         FCC  'ADCA'
  3684.         FCB  $89
  3685.         FCB  GEN
  3686.         FCC  'ADCB'
  3687.         FCB  $C9
  3688.         FCB  GEN
  3689.         FCC  'ADDA'
  3690.         FCB  $8B
  3691.         FCB  GEN
  3692.         FCC  'ADDB'
  3693.         FCB  $CB
  3694.         FCB  GEN
  3695.         FCC  'ADDD'
  3696.         FCB  $C3
  3697.         FCB  LIMM
  3698.         FCC  'ANDA'
  3699.         FCB  $84
  3700.         FCB  GEN
  3701.         FCC  'ANDB'
  3702.         FCB  $C4
  3703.         FCB  GEN
  3704.         FCC  'ASL '
  3705.         FCB  $68
  3706.         FCB  GRP2
  3707.         FCC  'ASLA'
  3708.         FCB  $48
  3709.         FCB  INH
  3710.         FCC  'ASLB'
  3711.         FCB  $58
  3712.         FCB  INH
  3713.         FCC  'ASLD'
  3714.         FCB  $05
  3715.         FCB  INH
  3716.         FCC  'ASR '
  3717.         FCB  $67
  3718.         FCB  GRP2
  3719.         FCC  'ASRA'
  3720.         FCB  $47
  3721.         FCB  INH
  3722.         FCC  'ASRB'
  3723.         FCB  $57
  3724.         FCB  INH
  3725.         FCC  'BCC '
  3726.         FCB  $24
  3727.         FCB  REL
  3728.         FCC  'BCLR'
  3729.         FCB  $1D
  3730.         FCB  SETCLR
  3731.         FCC  'BCS '
  3732.         FCB  $25
  3733.         FCB  REL
  3734.         FCC  'BEQ '
  3735.         FCB  $27
  3736.         FCB  REL
  3737.         FCC  'BGE '
  3738.         FCB  $2C
  3739.         FCB  REL
  3740.         FCC  'BGT '
  3741.         FCB  $2E
  3742.         FCB  REL
  3743.         FCC  'BHI '
  3744.         FCB  $22
  3745.         FCB  REL
  3746.         FCC  'BHS '
  3747.         FCB  $24
  3748.         FCB  REL
  3749.         FCC  'BITA'
  3750.         FCB  $85
  3751.         FCB  GEN
  3752.         FCC  'BITB'
  3753.         FCB  $C5
  3754.         FCB  GEN
  3755.         FCC  'BLE '
  3756.         FCB  $2F
  3757.         FCB  REL
  3758.         FCC  'BLO '
  3759.         FCB  $25
  3760.         FCB  REL
  3761.         FCC  'BLS '
  3762.         FCB  $23
  3763.         FCB  REL
  3764.         FCC  'BLT '
  3765.         FCB  $2D
  3766.         FCB  REL
  3767.         FCC  'BMI '
  3768.         FCB  $2B
  3769.         FCB  REL
  3770.         FCC  'BNE '
  3771.         FCB  $26
  3772.         FCB  REL
  3773.         FCC  'BPL '
  3774.         FCB  $2A
  3775.         FCB  REL
  3776.         FCC  'BRA '
  3777.         FCB  $20
  3778.         FCB  REL
  3779.         FCC  'BRCL'       (BRCLR)
  3780.         FCB  $1F
  3781.         FCB  BTB
  3782.         FCC  'BRN '
  3783.         FCB  $21
  3784.         FCB  REL
  3785.         FCC  'BRSE'       (BRSET)
  3786.         FCB  $1E
  3787.         FCB  BTB
  3788.         FCC  'BSET'
  3789.         FCB  $1C
  3790.         FCB  SETCLR
  3791.         FCC  'BSR '
  3792.         FCB  $8D
  3793.         FCB  REL
  3794.         FCC  'BVC '
  3795.         FCB  $28
  3796.         FCB  REL
  3797.         FCC  'BVS '
  3798.         FCB  $29
  3799.         FCB  REL
  3800.         FCC  'CBA '
  3801.         FCB  $11
  3802.         FCB  INH
  3803.         FCC  'CLC '
  3804.         FCB  $0C
  3805.         FCB  INH
  3806.         FCC  'CLI '
  3807.         FCB  $0E
  3808.         FCB  INH
  3809.         FCC  'CLR '
  3810.         FCB  $6F
  3811.         FCB  GRP2
  3812.         FCC  'CLRA'
  3813.         FCB  $4F
  3814.         FCB  INH
  3815.         FCC  'CLRB'
  3816.         FCB  $5F
  3817.         FCB  INH
  3818.         FCC  'CLV '
  3819.         FCB  $0A
  3820.         FCB  INH
  3821.         FCC  'CMPA'
  3822.         FCB  $81
  3823.         FCB  GEN
  3824.         FCC  'CMPB'
  3825.         FCB  $C1
  3826.         FCB  GEN
  3827.         FCC  'COM '
  3828.         FCB  $63
  3829.         FCB  GRP2
  3830.         FCC  'COMA'
  3831.         FCB  $43
  3832.         FCB  INH
  3833.         FCC  'COMB'
  3834.         FCB  $53
  3835.         FCB  INH
  3836.         FCC  'CPD '
  3837.         FCB  $83
  3838.         FCB  CPD
  3839.         FCC  'CPX '
  3840.         FCB  $8C
  3841.         FCB  XLIMM
  3842.         FCC  'CPY '
  3843.         FCB  $8C
  3844.         FCB  YLIMM
  3845.         FCC  'DAA '
  3846.         FCB  $19
  3847.         FCB  INH
  3848.         FCC  'DEC '
  3849.         FCB  $6A
  3850.         FCB  GRP2
  3851.         FCC  'DECA'
  3852.         FCB  $4A
  3853.         FCB  INH
  3854.         FCC  'DECB'
  3855.         FCB  $5A
  3856.         FCB  INH
  3857.         FCC  'DES '
  3858.         FCB  $34
  3859.         FCB  INH
  3860.         FCC  'DEX '
  3861.         FCB  $09
  3862.         FCB  INH
  3863.         FCC  'DEY '
  3864.         FCB  $09
  3865.         FCB  P2INH
  3866.         FCC  'EORA'
  3867.         FCB  $88
  3868.         FCB  GEN
  3869.         FCC  'EORB'
  3870.         FCB  $C8
  3871.         FCB  GEN
  3872.         FCC  'FDIV'
  3873.         FCB  $03
  3874.         FCB  INH
  3875.         FCC  'IDIV'
  3876.         FCB  $02
  3877.         FCB  INH
  3878.         FCC  'INC '
  3879.         FCB  $6C
  3880.         FCB  GRP2
  3881.         FCC  'INCA'
  3882.         FCB  $4C
  3883.         FCB  INH
  3884.         FCC  'INCB'
  3885.         FCB  $5C
  3886.         FCB  INH
  3887.         FCC  'INS '
  3888.         FCB  $31
  3889.         FCB  INH
  3890.         FCC  'INX '
  3891.         FCB  $08
  3892.         FCB  INH
  3893.         FCC  'INY '
  3894.         FCB  $08
  3895.         FCB  P2INH
  3896.         FCC  'JMP '
  3897.         FCB  $6E
  3898.         FCB  GRP2
  3899.         FCC  'JSR '
  3900.         FCB  $8D
  3901.         FCB  NIMM
  3902.         FCC  'LDAA'
  3903.         FCB  $86
  3904.         FCB  GEN
  3905.         FCC  'LDAB'
  3906.         FCB  $C6
  3907.         FCB  GEN
  3908.         FCC  'LDD '
  3909.         FCB  $CC
  3910.         FCB  LIMM
  3911.         FCC  'LDS '
  3912.         FCB  $8E
  3913.         FCB  LIMM
  3914.         FCC  'LDX '
  3915.         FCB  $CE
  3916.         FCB  XLIMM
  3917.         FCC  'LDY '
  3918.         FCB  $CE
  3919.         FCB  YLIMM
  3920.         FCC  'LSL '
  3921.         FCB  $68
  3922.         FCB  GRP2
  3923.         FCC  'LSLA'
  3924.         FCB  $48
  3925.         FCB  INH
  3926.         FCC  'LSLB'
  3927.         FCB  $58
  3928.         FCB  INH
  3929.         FCC  'LSLD'
  3930.         FCB  $05
  3931.         FCB  INH
  3932.         FCC  'LSR '
  3933.         FCB  $64
  3934.         FCB  GRP2
  3935.         FCC  'LSRA'
  3936.         FCB  $44
  3937.         FCB  INH
  3938.         FCC  'LSRB'
  3939.         FCB  $54
  3940.         FCB  INH
  3941.         FCC  'LSRD'
  3942.         FCB  $04
  3943.         FCB  INH
  3944.         FCC  'MUL '
  3945.         FCB  $3D
  3946.         FCB  INH
  3947.         FCC  'NEG '
  3948.         FCB  $60
  3949.         FCB  GRP2
  3950.         FCC  'NEGA'
  3951.         FCB  $40
  3952.         FCB  INH
  3953.         FCC  'NEGB'
  3954.         FCB  $50
  3955.         FCB  INH
  3956.         FCC  'NOP '
  3957.         FCB  $01
  3958.         FCB  INH
  3959.         FCC  'ORAA'
  3960.         FCB  $8A
  3961.         FCB  GEN
  3962.         FCC  'ORAB'
  3963.         FCB  $CA
  3964.         FCB  GEN
  3965.         FCC  'PSHA'
  3966.         FCB  $36
  3967.         FCB  INH
  3968.         FCC  'PSHB'
  3969.         FCB  $37
  3970.         FCB  INH
  3971.         FCC  'PSHX'
  3972.         FCB  $3C
  3973.         FCB  INH
  3974.         FCC  'PSHY'
  3975.         FCB  $3C
  3976.         FCB  P2INH
  3977.         FCC  'PULA'
  3978.         FCB  $32
  3979.         FCB  INH
  3980.         FCC  'PULB'
  3981.         FCB  $33
  3982.         FCB  INH
  3983.         FCC  'PULX'
  3984.         FCB  $38
  3985.         FCB  INH
  3986.         FCC  'PULY'
  3987.         FCB  $38
  3988.         FCB  P2INH
  3989.         FCC  'ROL '
  3990.         FCB  $69
  3991.         FCB  GRP2
  3992.         FCC  'ROLA'
  3993.         FCB  $49
  3994.         FCB  INH
  3995.         FCC  'ROLB'
  3996.         FCB  $59
  3997.         FCB  INH
  3998.         FCC  'ROR '
  3999.         FCB  $66
  4000.         FCB  GRP2
  4001.         FCC  'RORA'
  4002.         FCB  $46
  4003.         FCB  INH
  4004.         FCC  'RORB'
  4005.         FCB  $56
  4006.         FCB  INH
  4007.         FCC  'RTI '
  4008.         FCB  $3B
  4009.         FCB  INH
  4010.         FCC  'RTS '
  4011.         FCB  $39
  4012.         FCB  INH
  4013.         FCC  'SBA '
  4014.         FCB  $10
  4015.         FCB  INH
  4016.         FCC  'SBCA'
  4017.         FCB  $82
  4018.         FCB  GEN
  4019.         FCC  'SBCB'
  4020.         FCB  $C2
  4021.         FCB  GEN
  4022.         FCC  'SEC '
  4023.         FCB  $0D
  4024.         FCB  INH
  4025.         FCC  'SEI '
  4026.         FCB  $0F
  4027.         FCB  INH
  4028.         FCC  'SEV '
  4029.         FCB  $0B
  4030.         FCB  INH
  4031.         FCC  'STAA'
  4032.         FCB  $87
  4033.         FCB  NIMM
  4034.         FCC  'STAB'
  4035.         FCB  $C7
  4036.         FCB  NIMM
  4037.         FCC  'STD '
  4038.         FCB  $CD
  4039.         FCB  NIMM
  4040.         FCC  'STOP'
  4041.         FCB  $CF
  4042.         FCB  INH
  4043.         FCC  'STS '
  4044.         FCB  $8F
  4045.         FCB  NIMM
  4046.         FCC  'STX '
  4047.         FCB  $CF
  4048.         FCB  XNIMM
  4049.         FCC  'STY '
  4050.         FCB  $CF
  4051.         FCB  YNIMM
  4052.         FCC  'SUBA'
  4053.         FCB  $80
  4054.         FCB  GEN
  4055.         FCC  'SUBB'
  4056.         FCB  $C0
  4057.         FCB  GEN
  4058.         FCC  'SUBD'
  4059.         FCB  $83
  4060.         FCB  LIMM
  4061.         FCC  'SWI '
  4062.         FCB  $3F
  4063.         FCB  INH
  4064.         FCC  'TAB '
  4065.         FCB  $16
  4066.         FCB  INH
  4067.         FCC  'TAP '
  4068.         FCB  $06
  4069.         FCB  INH
  4070.         FCC  'TBA '
  4071.         FCB  $17
  4072.         FCB  INH
  4073.         FCC  'TPA '
  4074.         FCB  $07
  4075.         FCB  INH
  4076.         FCC  'TEST'
  4077.         FCB  $00
  4078.         FCB  INH
  4079.         FCC  'TST '
  4080.         FCB  $6D
  4081.         FCB  GRP2
  4082.         FCC  'TSTA'
  4083.         FCB  $4D
  4084.         FCB  INH
  4085.         FCC  'TSTB'
  4086.         FCB  $5D
  4087.         FCB  INH
  4088.         FCC  'TSX '
  4089.         FCB  $30
  4090.         FCB  INH
  4091.         FCC  'TSY '
  4092.         FCB  $30
  4093.         FCB  P2INH
  4094.         FCC  'TXS '
  4095.         FCB  $35
  4096.         FCB  INH
  4097.         FCC  'TYS '
  4098.         FCB  $35
  4099.         FCB  P2INH
  4100.         FCC  'WAI '
  4101.         FCB  $3E
  4102.         FCB  INH
  4103.         FCC  'XGDX'
  4104.         FCB  $8F
  4105.         FCB  INH
  4106.         FCC  'XGDY'
  4107.         FCB  $8F
  4108.         FCB  P2INH
  4109.         FCC  'BRSE'        bit direct modes for
  4110.         FCB  $12             disassembler.
  4111.         FCB  BTBD
  4112.         FCC  'BRCL'
  4113.         FCB  $13
  4114.         FCB  BTBD
  4115.         FCC  'BSET'
  4116.         FCB  $14
  4117.         FCB  SETCLRD
  4118.         FCC  'BCLR'
  4119.         FCB  $15
  4120.         FCB  SETCLRD
  4121.         FCB  EOT             End of table
  4122.  
  4123. **********************************************
  4124. PG1     EQU     $0
  4125. PG2     EQU     $1
  4126. PG3     EQU     $2
  4127. PG4     EQU     $3
  4128.  
  4129. ******************
  4130. *disassem() - disassemble the opcode.
  4131. ******************
  4132. *(check for page prebyte)
  4133. *baseop=pc[0];
  4134. *pnorm=PG1;
  4135. *if(baseop==$18) pnorm=PG2;
  4136. *if(baseop==$1A) pnorm=PG3;
  4137. *if(baseop==$CD) pnorm=PG4;
  4138. *if(pnorm != PG1) dispc=pc+1;
  4139. *else dispc=pc; (dispc points to next byte)
  4140.  
  4141. DISASSM EQU  *
  4142.         LDX  PC         address
  4143.         LDAA 0,X        opcode
  4144.         LDAB #PG1
  4145.         CMPA #$18
  4146.         BEQ  DISP2      jump if page2
  4147.         CMPA #$1A
  4148.         BEQ  DISP3      jump if page3
  4149.         CMPA #$CD
  4150.         BNE  DISP1      jump if not page4
  4151. DISP4   INCB            set up page value
  4152. DISP3   INCB
  4153. DISP2   INCB
  4154.         INX
  4155. DISP1   STX  DISPC      point to opcode
  4156.         STAB PNORM      save page
  4157.  
  4158. *If(opcode == ($00-$5F or $8D or $8F or $CF))
  4159. *  if(pnorm == (PG3 or PG4))
  4160. *      disillop(); return();
  4161. *  b=disrch(opcode,NULL);
  4162. *  if(b==0) disillop(); return();
  4163.  
  4164.         LDAA 0,X  get current opcode
  4165.         STAA BASEOP
  4166.         INX
  4167.         STX  DISPC      point to next byte
  4168.         CMPA #$5F
  4169.         BLS  DIS1       jump if in range
  4170.         CMPA #$8D
  4171.         BEQ  DIS1       jump if bsr
  4172.         CMPA #$8F
  4173.         BEQ  DIS1       jump if xgdx
  4174.         CMPA #$CF
  4175.         BEQ  DIS1       jump if stop
  4176.         JMP  DISGRP     try next part of map
  4177. DIS1    LDAB PNORM
  4178.         CMPB #PG3
  4179.         BLO  DIS2       jump if page 1 or 2
  4180.         JSR  DISILLOP   "illegal opcode"
  4181.         RTS
  4182. DIS2    LDAB BASEOP     opcode
  4183.         CLRB            class=null
  4184.         JSR  DISRCH
  4185.         TSTB
  4186.         BNE  DISPEC     jump if opcode found
  4187.         JSR  DISILLOP   "illegal opcode"
  4188.         RTS
  4189.  
  4190. *   if(opcode==$8D) dissrch(opcode,REL);
  4191. *   if(opcode==($8F or $CF)) disrch(opcode,INH);
  4192.  
  4193. DISPEC  LDAA BASEOP
  4194.         CMPA #$8D
  4195.         BNE  DISPEC1
  4196.         LDAB #REL
  4197.         BRA  DISPEC3    look for BSR opcode
  4198. DISPEC1 CMPA #$8F
  4199.         BEQ  DISPEC2    jump if XGDX opcode
  4200.         CMPA #$CF
  4201.         BNE  DISINH     jump not STOP opcode
  4202. DISPEC2 LDAB #INH
  4203. DISPEC3 JSR  DISRCH     find other entry in table
  4204.  
  4205. *   if(class==INH)           /* INH */
  4206. *      if(pnorm==PG2)
  4207. *         b=disrch(baseop,P2INH);
  4208. *         if(b==0) disillop(); return();
  4209. *      prntmne();
  4210. *      return();
  4211.  
  4212. DISINH  EQU  *
  4213.         LDAB CLASS
  4214.         CMPB #INH
  4215.         BNE  DISREL     jump if not inherent
  4216.         LDAB PNORM
  4217.         CMPB #PG1
  4218.         BEQ  DISINH1    jump if page1
  4219.         LDAA BASEOP     get opcode
  4220.         LDAB #P2INH     class=p2inh
  4221.         JSR  DISRCH
  4222.         TSTB
  4223.         BNE  DISINH1    jump if found
  4224.         JSR  DISILLOP   "illegal opcode"
  4225.         RTS
  4226. DISINH1 JSR  PRNTMNE
  4227.         RTS
  4228.  
  4229. *   elseif(class=REL)       /* REL */
  4230. *      if(pnorm != PG1)
  4231. *         disillop(); return();
  4232. *      prntmne();
  4233. *      disrelad();
  4234. *      return();
  4235.  
  4236. DISREL  EQU  *
  4237.         LDAB CLASS
  4238.         CMPB #REL
  4239.         BNE  DISBTD
  4240.         TST  PNORM
  4241.         BEQ  DISREL1    jump if page1
  4242.         JSR  DISILLOP   "illegal opcode"
  4243.         RTS
  4244. DISREL1 JSR  PRNTMNE    output mnemonic
  4245.         JSR  DISRELAD   compute relative address
  4246.         RTS
  4247.  
  4248. *   else           /* SETCLR,SETCLRD,BTB,BTBD */
  4249. *      if(class == (SETCLRD or BTBD))
  4250. *         if(pnorm != PG1)
  4251. *            disillop(); return();   /* illop */
  4252. *         prntmne();           /* direct */
  4253. *         disdir();           /* output $byte */
  4254. *      else (class == (SETCLR or BTB))
  4255. *         prntmne();           /* indexed */
  4256. *         disindx();
  4257. *      outspac();
  4258. *      disdir();
  4259. *      outspac();
  4260. *      if(class == (BTB or BTBD))
  4261. *         disrelad();
  4262. *   return();
  4263.  
  4264. DISBTD  EQU  *
  4265.         LDAB CLASS
  4266.         CMPB #SETCLRD
  4267.         BEQ  DISBTD1
  4268.         CMPB #BTBD
  4269.         BNE  DISBIT     jump not direct bitop
  4270. DISBTD1 TST  PNORM
  4271.         BEQ  DISBTD2    jump if page 1
  4272.         JSR  DISILLOP
  4273.         RTS
  4274. DISBTD2 JSR  PRNTMNE
  4275.         JSR  DISDIR     operand(direct)
  4276.         BRA  DISBIT1
  4277. DISBIT  EQU  *
  4278.         JSR  PRNTMNE
  4279.         JSR  DISINDX    operand(indexed)
  4280. DISBIT1 JSR  OUTSPAC
  4281.         JSR  DISDIR     mask
  4282.         LDAB CLASS
  4283.         CMPB #BTB
  4284.         BEQ  DISBIT2    jump if btb
  4285.         CMPB #BTBD
  4286.         BNE  DISBIT3    jump if not bit branch
  4287. DISBIT2 JSR  DISRELAD   relative address
  4288. DISBIT3 RTS
  4289.  
  4290.  
  4291. *Elseif($60 <= opcode <= $7F)  /*  GRP2 */
  4292. *   if(pnorm == (PG3 or PG4))
  4293. *      disillop(); return();
  4294. *   if((pnorm==PG2) and (opcode != $6x))
  4295. *      disillop(); return();
  4296. *   b=disrch(baseop & $6F,NULL);
  4297. *   if(b==0) disillop(); return();
  4298. *   prntmne();
  4299. *   if(opcode == $6x)
  4300. *      disindx();
  4301. *   else
  4302. *      disext();
  4303. *   return();
  4304.  
  4305. DISGRP  EQU  *
  4306.         CMPA #$7F       a=opcode
  4307.         BHI  DISNEXT    try next part of map
  4308.         LDAB PNORM
  4309.         CMPB #PG3
  4310.         BLO  DISGRP2    jump if page 1 or 2
  4311.         JSR  DISILLOP   "illegal opcode"
  4312.         RTS
  4313. DISGRP2 ANDA #$6F       mask bit 4
  4314.         CLRB            class=null
  4315.         JSR  DISRCH
  4316.         TSTB
  4317.         BNE  DISGRP3    jump if found
  4318.         JSR  DISILLOP   "illegal opcode"
  4319.         RTS
  4320. DISGRP3 JSR  PRNTMNE
  4321.         LDAA BASEOP     get opcode
  4322.         ANDA #$F0
  4323.         CMPA #$60
  4324.         BNE  DISGRP4    jump if not 6x
  4325.         JSR  DISINDX    operand(indexed)
  4326.         RTS
  4327. DISGRP4 JSR  DISEXT     operand(extended)
  4328.         RTS
  4329.  
  4330. *Else  ($80 <= opcode <= $FF)
  4331. *   if(opcode == ($87 or $C7))
  4332. *      disillop(); return();
  4333. *   b=disrch(opcode&$CF,NULL);
  4334. *   if(b==0) disillop(); return();
  4335.  
  4336. DISNEXT EQU  *
  4337.         CMPA #$87       a=opcode
  4338.         BEQ  DISNEX1
  4339.         CMPA #$C7
  4340.         BNE  DISNEX2
  4341. DISNEX1 JSR  DISILLOP   "illegal opcode"
  4342.         RTS
  4343. DISNEX2 ANDA #$CF
  4344.         CLRB            class=null
  4345.         JSR  DISRCH
  4346.         TSTB
  4347.         BNE  DISNEW     jump if mne found
  4348.         JSR  DISILLOP   "illegal opcode"
  4349.         RTS
  4350.  
  4351. *   if(opcode&$CF==$8D) disrch(baseop,NIMM; (jsr)
  4352. *   if(opcode&$CF==$8F) disrch(baseop,NIMM; (sts)
  4353. *   if(opcode&$CF==$CF) disrch(baseop,XNIMM; (stx)
  4354. *   if(opcode&$CF==$83) disrch(baseop,LIMM); (subd)
  4355.  
  4356. DISNEW  LDAA BASEOP
  4357.         ANDA #$CF
  4358.         CMPA #$8D
  4359.         BNE  DISNEW1    jump not jsr
  4360.         LDAB #NIMM
  4361.         BRA  DISNEW4
  4362. DISNEW1 CMPA #$8F
  4363.         BNE  DISNEW2    jump not sts
  4364.         LDAB #NIMM
  4365.         BRA  DISNEW4
  4366. DISNEW2 CMPA #$CF
  4367.         BNE  DISNEW3    jump not stx
  4368.         LDAB #XNIMM
  4369.         BRA  DISNEW4
  4370. DISNEW3 CMPA #$83
  4371.         BNE  DISGEN     jump not subd
  4372.         LDAB #LIMM
  4373. DISNEW4 JSR  DISRCH
  4374.         TSTB
  4375.         BNE  DISGEN     jump if found
  4376.         JSR  DISILLOP   "illegal opcode"
  4377.         RTS
  4378.  
  4379. *   if(class == (GEN or NIMM or LIMM   ))   /* GEN,NIMM,LIMM,CPD */
  4380. *      if(opcode&$CF==$83)
  4381. *         if(pnorm==(PG3 or PG4)) disrch(opcode#$CF,CPD)
  4382. *         class=LIMM;
  4383. *      if((pnorm == (PG2 or PG4) and (opcode != ($Ax or $Ex)))
  4384. *         disillop(); return();
  4385. *      disgenrl();
  4386. *      return();
  4387.  
  4388. DISGEN  LDAB CLASS      get class
  4389.         CMPB #GEN
  4390.         BEQ  DISGEN1
  4391.         CMPB #NIMM
  4392.         BEQ  DISGEN1
  4393.         CMPB #LIMM
  4394.         BNE  DISXLN     jump if other class
  4395. DISGEN1 LDAA BASEOP
  4396.         ANDA #$CF
  4397.         CMPA #$83
  4398.         BNE  DISGEN3    jump if not #$83
  4399.         LDAB PNORM
  4400.         CMPB #PG3
  4401.         BLO  DISGEN3    jump not pg3 or 4
  4402.         LDAB #CPD
  4403.         JSR  DISRCH     look for cpd mne
  4404.         LDAB #LIMM
  4405.         STAB CLASS      set class to limm
  4406. DISGEN3 LDAB PNORM
  4407.         CMPB #PG2
  4408.         BEQ  DISGEN4    jump if page 2
  4409.         CMPB #PG4
  4410.         BNE  #DISGEN5   jump not page 2 or 4
  4411. DISGEN4 LDAA BASEOP
  4412.         ANDA #$B0       mask bits 6,3-0
  4413.         CMPA #$A0
  4414.         BEQ  DISGEN5     jump if $Ax or $Ex
  4415.         JSR  DISILLOP   "illegal opcode"
  4416.         RTS
  4417. DISGEN5 JSR  DISGENRL   process general class
  4418.         RTS
  4419.  
  4420. *   else       /* XLIMM,XNIMM,YLIMM,YNIMM */
  4421. *      if(pnorm==(PG2 or PG3))
  4422. *         if(class==XLIMM) disrch(opcode&$CF,YLIMM);
  4423. *         else disrch(opcode&$CF,YNIMM);
  4424. *      if((pnorm == (PG3 or PG4))
  4425. *         if(opcode != ($Ax or $Ex))
  4426. *            disillop(); return();
  4427. *      class=LIMM;
  4428. *      disgen();
  4429. *   return();
  4430.  
  4431. DISXLN  LDAB PNORM
  4432.         CMPB #PG2
  4433.         BEQ  DISXLN1    jump if page2
  4434.         CMPB #PG3
  4435.         BNE  DISXLN4    jump not page3
  4436. DISXLN1 LDAA BASEOP
  4437.         ANDA #$CF
  4438.         LDAB CLASS
  4439.         CMPB #XLIMM
  4440.         BNE  DISXLN2
  4441.         LDAB #YLIMM
  4442.         BRA  DISXLN3    look for ylimm
  4443. DISXLN2 LDAB #YNIMM     look for ynimm
  4444. DISXLN3 JSR  DISRCH
  4445. DISXLN4 LDAB PNORM
  4446.         CMPB #PG3
  4447.         BLO  DISXLN5    jump if page 1 or 2
  4448.         LDAA BASEOP     get opcode
  4449.         ANDA #$B0       mask bits 6,3-0
  4450.         CMPA #$A0
  4451.         BEQ  DISXLN5    jump opcode = $Ax or $Ex
  4452.         JSR  DISILLOP   "illegal opcode"
  4453.         RTS
  4454. DISXLN5 LDAB #LIMM
  4455.         STAB CLASS
  4456.         JSR  DISGENRL   process general class
  4457.         RTS
  4458.  
  4459.  
  4460. ******************
  4461. *disrch(a=opcode,b=class)
  4462. *return b=0 if not found
  4463. *  else mneptr=points to mnemonic
  4464. *        class=class of opcode
  4465. ******************
  4466. *x=#MNETABL
  4467. *while(x[0] != eot)
  4468. *   if((opcode==x[4]) && ((class=NULL) || (class=x[5])))
  4469. *      mneptr=x;
  4470. *      class=x[5];
  4471. *      return(1);
  4472. *   x += 6;
  4473. *return(0);      /* not found */
  4474.  
  4475. DISRCH  EQU  *
  4476.         LDX  #MNETABL   point to top of table
  4477. DISRCH1 CMPA 4,X        test opcode
  4478.         BNE  DISRCH3    jump not this entry
  4479.         TSTB
  4480.         BEQ  DISRCH2    jump if class=null
  4481.         CMPB 5,X        test class
  4482.         BNE  DISRCH3    jump not this entry
  4483. DISRCH2 LDAB 5,X
  4484.         STAB CLASS
  4485.         STX  MNEPTR     return ptr to mnemonic
  4486.         INCB
  4487.         RTS             return found
  4488. DISRCH3 PSHB            save class
  4489.         LDAB #6
  4490.         ABX
  4491.         LDAB 0,X
  4492.         CMPB #EOT       test end of table
  4493.         PULB
  4494.         BNE  DISRCH1
  4495.         CLRB
  4496.         RTS             return not found
  4497.  
  4498. ******************
  4499. *prntmne() - output the mnemonic pointed
  4500. *at by mneptr.
  4501. ******************
  4502. *outa(mneptr[0-3]);
  4503. *outspac;
  4504. *return();
  4505.  
  4506. PRNTMNE EQU  *
  4507.         LDX  MNEPTR
  4508.         LDAA 0,X
  4509.         JSR  OUTA       output char1
  4510.         LDAA 1,X
  4511.         JSR  OUTA       output char2
  4512.         LDAA 2,X
  4513.         JSR  OUTA       output char3
  4514.         LDAA 3,X
  4515.         JSR  OUTA       output char4
  4516.         JSR  OUTSPAC
  4517.         RTS
  4518.  
  4519. ******************
  4520. *disindx() - process indexed mode
  4521. ******************
  4522. *disdir();
  4523. *outa(',');
  4524. *if(pnorm == (PG2 or PG4)) outa('Y');
  4525. *else outa('X');
  4526. *return();
  4527.  
  4528. DISINDX EQU  *
  4529.         JSR  DISDIR     output $byte
  4530.         LDAA #','
  4531.         JSR  OUTA       output ,
  4532.         LDAB PNORM
  4533.         CMPB #PG2
  4534.         BEQ  DISIND1    jump if page2
  4535.         CMPB #PG4
  4536.         BNE  DISIND2    jump if not page4
  4537. DISIND1 LDAA #'Y'
  4538.         BRA DISIND3
  4539. DISIND2 LDAA #'X'
  4540. DISIND3 JSR  OUTA       output x or y
  4541.         RTS
  4542.  
  4543. ******************
  4544. *disrelad() - compute and output relative address.
  4545. ******************
  4546. * braddr = dispc[0] + (dispc++);( 2's comp arith)
  4547. *outa('$');
  4548. *out2bsp(braddr);
  4549. *return();
  4550.  
  4551. DISRELAD EQU *
  4552.         LDX  DISPC
  4553.         LDAB 0,X        get relative offset
  4554.         INX
  4555.         STX  DISPC
  4556.         TSTB
  4557.         BMI  DISRLD1    jump if negative
  4558.         ABX
  4559.         BRA  DISRLD2
  4560. DISRLD1 DEX
  4561.         INCB
  4562.         BNE  DISRLD1    subtract
  4563. DISRLD2 STX  BRADDR     save address
  4564.         JSR  OUTSPAC
  4565.         LDAA #'$'
  4566.         JSR  OUTA
  4567.         LDX  #BRADDR
  4568.         JSR  OUT2BSP    output address
  4569.         RTS
  4570.  
  4571.  
  4572. ******************
  4573. *disgenrl() - output data for the general cases which
  4574. *includes immediate, direct, indexed, and extended modes.
  4575. ******************
  4576. *prntmne();
  4577. *if(baseop == ($8x or $Cx))   /* immediate */
  4578. *   outa('#');
  4579. *   disdir();
  4580. *   if(class == LIMM)
  4581. *      out1byt(dispc++);
  4582. *elseif(baseop == ($9x or $Dx))  /* direct */
  4583. *   disdir();
  4584. *elseif(baseop == ($Ax or $Ex)) /* indexed */
  4585. *   disindx();
  4586. *else  (baseop == ($Bx or $Fx)) /* extended */
  4587. *   disext();
  4588. *return();
  4589.  
  4590. DISGENRL EQU *
  4591.         JSR  PRNTMNE    print mnemonic
  4592.         LDAA BASEOP     get opcode
  4593.         ANDA #$B0       mask bits 6,3-0
  4594.         CMPA #$80
  4595.         BNE  DISGRL2   jump if not immed
  4596.         LDAA #'#'       do immediate
  4597.         JSR  OUTA
  4598.         JSR  DISDIR
  4599.         LDAB CLASS
  4600.         CMPB #LIMM
  4601.         BEQ  DISGRL1   jump class = limm
  4602.         RTS
  4603. DISGRL1 LDX  DISPC
  4604.         JSR  OUT1BYT
  4605.         STX  DISPC
  4606.         RTS
  4607. DISGRL2 CMPA #$90
  4608.         BNE  DISGRL3    jump not direct
  4609.         JSR  DISDIR     do direct
  4610.         RTS
  4611. DISGRL3 CMPA #$A0
  4612.         BNE  DISGRL4    jump not indexed
  4613.         JSR  DISINDX    do extended
  4614.         RTS
  4615. DISGRL4 JSR  DISEXT     do extended
  4616.         RTS
  4617.  
  4618. *****************
  4619. *disdir() - output "$ next byte"
  4620. *****************
  4621. DISDIR  EQU  *
  4622.         LDAA #'$'
  4623.         JSR  OUTA
  4624.         LDX  DISPC
  4625.         JSR  OUT1BYT
  4626.         STX  DISPC
  4627.         RTS
  4628.  
  4629. *****************
  4630. *disext() - output "$ next 2 bytes"
  4631. *****************
  4632. DISEXT  EQU  *
  4633.         LDAA #'$'
  4634.         JSR  OUTA
  4635.         LDX  DISPC
  4636.         JSR  OUT2BSP
  4637.         STX  DISPC
  4638.         RTS
  4639.  
  4640.  
  4641. *****************
  4642. *disillop() - output "illegal opcode"
  4643. *****************
  4644. DISMSG1 FCC  'ILLOP'
  4645.         FCB  EOT
  4646. DISILLOP EQU *
  4647.         PSHX
  4648.         LDX  #DISMSG1
  4649.         JSR  OUTSTRG0   no cr
  4650.         PULX
  4651.         RTS
  4652.  
  4653. * Equates
  4654. JPORTD  EQU   $08
  4655. JDDRD   EQU   $09
  4656. JBAUD   EQU   $2B
  4657. JSCCR1  EQU   $2C
  4658. JSCCR2  EQU   $2D
  4659. JSCSR   EQU   $2E
  4660. JSCDAT  EQU   $2F
  4661. *
  4662.  
  4663. ************
  4664. *  boot [<addr>] - Use SCI to talk to an 'hc11 in
  4665. * boot mode.  Downloads 256 bytes starting at addr.
  4666. * Default addr = $2000.
  4667. ************
  4668.  
  4669. *Get arguments
  4670. *If no args, default $2000
  4671. BOOT    JSR   WSKIP
  4672.         CMPA  #$0D
  4673.         BNE   BOT1       jump if arguments
  4674.         LDY   #$2000
  4675.         BRA   BOT2       go - use default address
  4676.  
  4677. *Else get arguments
  4678. BOT1    JSR   BUFFARG
  4679.         TST   COUNT
  4680.         BEQ   BOTERR    jump if no address
  4681.         JSR   WSKIP
  4682.         LDY   SHFTREG   start address
  4683.         CMPA  #$D
  4684.         BEQ   BOT2      go - use arguments
  4685. BOTERR  LDX   #MSG9     "bad argument"
  4686.         JSR   OUTSTRG
  4687.         RTS
  4688.  
  4689. *Boot routine
  4690. BOT2    LDAB  #$FF       control character ($ff -> download)
  4691.         JSR   BTSUB      set up SCI and send control char
  4692.  
  4693. *Download 256 byte block
  4694.         CLRB            counter
  4695. BLOP    LDAA  0,Y
  4696.         STAA  JSCDAT,X  write to transmitter
  4697.         INY
  4698.         BRCLR JSCSR,X $80 *      wait for TDRE
  4699.         DECB
  4700.         BNE   BLOP
  4701.         RTS
  4702.  
  4703. ************************************************
  4704. *Subroutine
  4705. *  btsub   - sets up SCI and outputs control character
  4706. * On entry, B = control character
  4707. * On exit,  X = $1000
  4708. *           A = $0C
  4709. ***************************
  4710.  
  4711. BTSUB   EQU   *
  4712.         LDX   #$1000    to use indexed addressing
  4713.         LDAA  #$02
  4714.         STAA  JPORTD,X  drive transmitter line
  4715.         STAA  JDDRD,X     high
  4716.         CLR   JSCCR2,X  turn off XMTR and RCVR
  4717.         LDAA  #$22      BAUD = /16
  4718.         STAA  JBAUD,X
  4719.         LDAA  #$0C      TURN ON XMTR & RCVR
  4720.         STAA  JSCCR2,X
  4721.         STAB  JSCDAT,X
  4722.         BRCLR JSCSR,X $80 *   wait for TDRE
  4723.         RTS
  4724.  
  4725. ******************
  4726. *
  4727. *    EVBTEST - This routine makes it a little easier
  4728. *    on us to test this board.
  4729. *
  4730. ******************
  4731.  
  4732. EVBTEST  LDAA  #$FF
  4733.  
  4734.          STAA  $1000    Write ones to port A
  4735.  
  4736.          CLR  AUTOLF    Turn off auto lf
  4737.          JSR  HOSTCO    Connect host
  4738.          JSR  HOSTINIT  Initialize host
  4739.  
  4740.          LDAA #$7f
  4741.          JSR  HOSTOUT   Send Delete to Altos
  4742.          LDAA #$0d
  4743.          JSR  HOSTOUT   Send <CR>
  4744.          INC  AUTOLF    Turn on Auto LF
  4745.          LDX  #INBUFF+5 Point at Load message
  4746.          STX  PTR0      Set pointer for load command
  4747.          LDY  #MSGEVB   Point at cat line
  4748. LOOP     LDAA 0,Y       Loop to xfer command line
  4749.          CMPA #04       Into buffalo line buffer
  4750.          BEQ  DONE      Quit on $04
  4751.          STAA 0,X
  4752.          INX            next character
  4753.          INY
  4754.          BRA  LOOP
  4755. DONE     CLR  TMP2      Set load vs. verify
  4756.          JSR  LOAD1B    Jmp into middle of load
  4757.          LDS  #STACK    Reset Stack
  4758.          JMP  $C0B3     Jump to Downloaded code
  4759.  
  4760. MSGEVB     FCC  /cat evbtest.out/
  4761.          FCB  $0D
  4762.          FCB  $04
  4763.  
  4764.         ORG     ROMBS+$1FA0
  4765. *** Jump table ***
  4766. .UPCASE JMP     UPCASE
  4767. .WCHEK  JMP     WCHEK
  4768. .DCHEK  JMP     DCHEK
  4769. .INIT   JMP     INIT
  4770. .INPUT  JMP     INPUT
  4771. .OUTPUT JMP     OUTPUT
  4772. .OUTLHL JMP     OUTLHLF
  4773. .OUTRHL JMP     OUTRHLF
  4774. .OUTA   JMP     OUTA
  4775. .OUT1BY JMP     OUT1BYT
  4776. .OUT1BS JMP     OUT1BSP
  4777. .OUT2BS JMP     OUT2BSP
  4778. .OUTCRL JMP     OUTCRLF
  4779. .OUTSTR JMP     OUTSTRG
  4780. .OUTST0 JMP     OUTSTRG0
  4781. .INCHAR JMP     INCHAR
  4782. .VECINT JMP    VECINIT
  4783.  
  4784.          ORG    ROMBS+$1FD6
  4785. *** Vectors ***
  4786. VSCI     FDB    JSCI
  4787. VSPI     FDB    JSPI
  4788. VPAIE    FDB    JPAIE
  4789. VPAO     FDB    JPAO
  4790. VTOF     FDB    JTOF
  4791. VTOC5    FDB    JTOC5
  4792. VTOC4    FDB    JTOC4
  4793. VTOC3    FDB    JTOC3
  4794. VTOC2    FDB    JTOC2
  4795. VTOC1    FDB    JTOC1
  4796. VTIC3    FDB    JTIC3
  4797. VTIC2    FDB    JTIC2
  4798. VTIC1    FDB    JTIC1
  4799. VRTI     FDB    JRTI
  4800. VIRQ     FDB    JIRQ
  4801. VXIRQ    FDB    JXIRQ
  4802. VSWI     FDB    JSWI
  4803. VILLOP   FDB    JILLOP
  4804. VCOP     FDB    JCOP
  4805. VCLM     FDB    JCLM
  4806. VRST     FDB    BUFFALO
  4807.  
  4808.